[BOJ] 4354번 문자열 제곱 - Python

"문자열 알고리즘 1"

Posted by Yongmin on September 28, 2021

문제

문자열 제곱

풀이

KMP의 failure function을 통해, 해당 문자에 prefix == suffix인 최대길이를 확인한다.(index 1부터 counting하므로, aaaa -> a[3] = 4가 아니라 3이다.)
기존 문자열의 길이에 len(s)-1의 index에 위치한 것의 prefix == suffix인 pi[len(s)-1]를 빼면, 최소 반복 길이를 구할 수 있다.
이를 전체 문자열의 길이에 나누면 원하는 정답을 도출해낼 수 있다.
abcdabc와 같이 pi[len(s)-1] = 3이지만, 제곱수가 1인 경우 역시도 7//4 = 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
import sys
from math import *

def failure_function(s):
    pi = [0] * len(s)
    j = 0
    for i in range(1, len(s)):
        while(j>0 and s[i] != s[j]):
            j = pi[j-1]

        if(s[i] == s[j]):
            j = j+1
            pi[i] = j
                
    return pi


while(True):
    s = input()

    if(s == "."):
        break

    pi = failure_function(s)
    
    min_size = len(s) - pi[len(s)-1]

    if(len(s) % min_size == 0):
            print(len(s)//min_size)
    else:
        print(1)
    
    





# # #