Baekjoon

Baekjoon 1786번 찾기

ppwag 2020. 8. 15. 20:38

문제

https://www.acmicpc.net/problem/1786

걸린 시간

00 : 19 : 51

풀이

Python3

def getPi():
    pi = [0]*m
    j = 0
    for i in range(1, m):
        while j > 0 and P[j] != P[i]:
            j = pi[j-1]

        if P[j] == P[i]:
            j += 1
            pi[i] = j
    return pi

def kmp():
    ans = []
    pi = getPi()
    j = 0
    for i in range(0, n):
        while j > 0 and T[i] != P[j]:
            j = pi[j-1]

        if T[i] == P[j]:
            if j == m-1:
                ans.append(i-m+1)
                j = pi[j]
            else:
                j += 1
    return ans

if __name__ == "__main__":
    T = input() # 텍스트
    P = input() # 패턴

    n = len(T)
    m = len(P)

    result = kmp()
    print(len(result))
    for i in result:
        print(i+1)

다른 문제로 kmp 알고리즘을 공부한 다음 복습 개념으로 푼 문제이다.

kmp 알고리즘을 전혀 모르는 상태에서 문제에 주어진 설명만 읽고 이해한 후 구현하는 것이 과연 가능할까싶다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 6064번 카잉 달력  (0) 2020.08.16
Baekjoon 2667번 단지번호붙이기  (0) 2020.08.15
Baekjoon 5525번 IOIOI  (3) 2020.08.15
Baekjoon 9205번 맥주 마시면서 걸어가기  (0) 2020.08.14
Baekjoon 9019번 DSLR  (0) 2020.08.14

댓글