https://www.acmicpc.net/problem/4354
def create_pi_table(pattern):
table = [0] * len(pattern)
i = 0
for j in range(1, len(pattern)):
while i > 0 and pattern[i] != pattern[j]:
i = table[i-1]
if pattern[i] == pattern[j]:
i += 1
table[j] = i
return table
while True:
s = input().strip()
if s == '.':
break
table = create_pi_table(s)
n = len(s)
# 주기 계산
period = n - table[n - 1]
if n % period == 0:
print(n // period)
else:
print(1)
문자열의 반복되는 최소 패턴은 즉, 주기는 가장 긴 접두사나 접미사를 제외할 때 이므로 이를 화룡해서 주기의 길이를 구하고 이 주기가 반복될 수 있는지를 나머지 연산을 통해 구해주면 된다. 만약 나누어 떨어진다면 완전히 반복되므로 이를 나누어 출력하면 되고 그렇지 않을 경우에는 반복이 불가능 하므로 전체가 한 패턴 취급이 되어 1을 출력하면 된다.
이렇게 Python으로 백준의 "문자열 제곱" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊