문자열 검색 알고리즘, KMP 알고리즘에 대해서 설명을 시작합니다~!
시작하기 전에 다들 백준이나 프로그래머스에서 알고리즘 문제을 풀 때 한번쯤은 문자열 검색 문제를 마주했을거라고 예상합니다. 효율성을 따지지 않고 간단하게 생각해본다면 이렇게 생각할 수 있습니다.
라는 예제를 가져와봤는데요. 간단히 생각해서 풀어보면
이렇게 "ABC"를 한글자씩 옮겨가며 비교를 하게됩니다.
하지만 효율성을 따지지 않았기 때문에 비교해야하는 대상이 10만개, 수만개가 되면 타임오버가됩니다. 이런 현상을 방지하게 만든 알고리즘이 바로 KMP 알고리즘 입니다.
잠시만요! 알고리즘에 대해서 알아보기 전에 사전지식이 필요합니다.
첫번째로 접두사와 접미사를 알아야합니다. 예시를 통해서 쉽게 알려드리겠습니다.
Banana를 예시로 들어보겠습니다.
Banana의 접두사(prefix)는 앞에서부터 차례대로의 부분문자열이라고 생각하면됩니다.
Banana의 접미사(suffix)는 뒤에서부터 차례대로의 부분문자열이라고 생각하면됩니다.
: pi[i]는 주어진 문자열의 0~i까지의 부분 문자열 중에서 prefix == suffix가 될 수 있는 부분문자열 중에서 가장 긴 것의 길이
예시를 통해서 이해하기 쉽게 설명해드리겠습니다.
pi[5] = 3 일 때 가장 길다는 것을 알 수 있습니다.
결론은 매칭되는 길이마다 접두사와 접미사가 같은 부분 문자열을 찾아서 그 길이 중 가장 긴 길이를 구하면 어디서부터 탐색할지 정할 수 있습니다.
이제 본격적으로 알아볼까요??