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; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; 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 | 
