반응형
https://www.acmicpc.net/problem/1305
1305번: 광고
세준이는 길 한가운데에서 전광판을 쳐다보고 있었다. 전광판에는 광고가 흘러나오고 있었다. 한참을 전광판을 쳐다본 세준이는 이 광고가 의미하는 것이 무엇인지 궁금해지기 시작했다. 전광
www.acmicpc.net
해결 방법 : Failure Function
- KMP 알고리즘에 대해 모르는 상태로 어떻게든 풀어보려다가 3시간 동안 시간초과를 해결하지 못했다...
- KMP 알고리즘에 사용되는 failure function을 적용하면 간단하게 풀리긴 하지만, 이해는 간단하지 않음..
- failure function은 문자열 안에서, 접두사와 접미사가 동일한 최대 길이를 찾는다. (참고 사이트)
- AABAAABAA 를 예로 들면, failure function으로 [0,1,0,1,2,2,3,4,5]라는 table을 얻을 수 있다.
- 여기서 마지막 값 5의 의미는 5번 연속으로 문자열의 접두사와 동일한 문자가 나타나고 있다는 뜻이다.
- 즉, 처음부터 마지막 문자의 5번 이전까지의 부분 문자열이 중복되고 있는, 그리고 최소일 것으로 기대할 수 있는 문자열이 된다.
import sys
input = sys.stdin.readline
def solution(L, ad):
failure = [0] * (L)
l, r = 0, 1 # left, right
while r < L: # failure function
if ad[l] == ad[r]: # 문자가 같으면 l, r 모두 증가시켜 다음 문자 비교
failure[r] = l + 1
l += 1
r += 1
else:
if l == 0: # l이 첫번째 문자이며, 문자가 다르기 때문에 r만 증가
r += 1
else: # l의 이전값의 failure function값을 l로 하여 다시 비교
l = failure[l - 1]
return L - failure[L-1]
if __name__ == '__main__':
L = int(input())
ad = input().strip()
result = solution(L, ad)
print(result)
반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
백준 1298 : 노트북의 주인을 찾아서 (0) | 2021.07.26 |
---|---|
백준 1854 : K번째 최단경로 찾기 (0) | 2021.07.25 |
백준 1071 : 소트 (0) | 2021.07.23 |
백준 9489 : 사촌 (0) | 2021.07.22 |
백준 2696 : 중앙값 구하기 (0) | 2021.07.18 |