흙금이네 블로그

[BOJ] 1305 - 광고 (Python) 본문

알고리즘

[BOJ] 1305 - 광고 (Python)

흙금 2023. 1. 21. 22:56

 

 

아이디어

 

문자열의 접두사와 접미사가 일치하는 최대 길이를 구한다.

 

 

풀이 #1

 

KMP 알고리즘을 이용하여 부분 일치 테이블 lps를 구한 후, 맨 마지막 문자의 부분 일치 값을 전체 길이 N에서 뺀다. 

 

def last_lps():
    S = input()
    lps = [0]*L
    j = 0
    for i in range(1, L):
        while j > 0 and S[i] != S[j]:
            j = lps[j-1]
        if S[i] == S[j]:
            j += 1
            lps[i] = j
    return lps[-1]

L = int(input())
print(L-last_lps())

 

 

테이블 생성 코드를 함수로 따로 빼지 않은 코드는 메모리 사용량은 비슷했으나 더 느렸다.

# 더 느린 코드
L = int(input())
S = input()
lps = [0]*L
j = 0
for i in range(1, L):
    while j > 0 and S[i] != S[j]:
        j = lps[j-1]
    if S[i] == S[j]:
        j += 1
        lps[i] = j
print(L-lps[-1])

 

 

 

풀이 #2

 

다른 분의 풀이를 보니 부분 일치 테이블에 모든 부분 문자열에 대해 저장할 필요가 없다는 것을 깨달았다.

문자가 일치하지 않을 때에만 그 직전 인덱스에 일치했던 길이를 저장하여 부분 일치 테이블 lps를 만든다.

 

def last_lps():
    lps = [0]*L
    i = 1
    j = 0
    while i < L:
        if S[i] == S[j]:
            j += 1
        elif j > 0:
            lps[i-1] = j
            j = lps[j-1]
            continue
        i += 1
    return j

L = int(input())
S = input()
print(L-last_lps())

 

Comments