본문 바로가기

ProgramSoliving

백준 : 4354 java

반응형

https://www.acmicpc.net/problem/4354

 

4354번: 문자열 제곱

문제 알파벳 소문자로 이루어진 두 문자열 a와 b가 주어졌을 때, a*b는 두 문자열을 이어붙이는 것을 뜻한다. 예를 들어, a="abc", b="def"일 때, a*b="abcdef"이다. 이러한 이어 붙이는 것을 곱셈으로 생각한다면, 음이 아닌 정수의 제곱도 정의할 수 있다. a^0 = "" (빈 문자열) a^(n+1) = a*(a^n) 문자열 s가 주어졌을 때, 어떤 문자열 a에 대해서 s=a^n을 만족하는 가장 큰 n을 찾는 프로그램을 작성하시오.

www.acmicpc.net

 

KMP 알고리즘의 Pi값을 이용해서 문제를 풀수 있었다.

 

ababab 문자열의 Pi값을 구해보면 = [0, 0, 1, 2, 3, 4] 라는걸 알 수 있다.

 

여기서 Pi값은 무엇을 나타내는 것일지 생각해본다면 Pi[x] = y 라 할때

 

0~y 의 배열들이  (length - y) ~ x 까지 패턴과 똑같다라는 것을 나타낸다.

 

0~ y : abab

(length - y) ~ x : abab

 

여기서 구해야할 것은 가장 작은 단위의 반복이다. 즉 abㅣabㅣab  라면 length - Pi[x] 값이 2가되고 이것이 가장 작은 반복 단위가된다. 

 

그러면 length / 반복단위 하면 되는 것일까??? 문제가있다. 길이가 7인것에도 반복단위가 2일 수도있다.

ex) abababa   -> 반복 단위 2   하지만 답은 1이다. 따라서 반복단위로 나누어 떨어지지 않으면 1을 출력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package algo;
 
 
public class B4354 {
 
    public static int[] getPi(String Pattern) {
        int[] Pi = new int[Pattern.length()];
 
        int j = 0;
 
        for (int i = 1; i < Pattern.length(); i++) {
 
            while (j > 0 && Pattern.charAt(i) != Pattern.charAt(j)) {
                j = Pi[j - 1];
            }
 
            if (Pattern.charAt(i) == Pattern.charAt(j)) {
                Pi[i] = ++j;
            }
        }
        return Pi;
    }
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        while (true) {
            String Pattern = br.readLine();
            if (Pattern.charAt(0== '.')
                break;
            int[] Pi = getPi(Pattern);
            int ans = Pi.length % (Pi.length - Pi[Pi.length - 1]) == 0 ? Pi.length / (Pi.length - Pi[Pi.length - 1])
                    : 1;
 
            sb.append(ans).append('\n');
        }
 
        System.out.print(sb.toString());
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 2252 DFS ,BFS  (0) 2020.05.13
백준 : 2262  (0) 2020.05.06
백준 : 17387  (0) 2020.05.05
백준 : 3025 java (돌 던지기)  (0) 2020.05.04
백준 : 2116 자바  (0) 2020.05.03