문자열 검색 알고리즘인 KMP (Knuth-Morris-Pratt)는 단순한 비교가 아니라, 오토마타(DFA)처럼 상태를 가지며 동작하는 구조로도 이해할 수 있습니다. 이 글에서는 최대한 쉽게 그 원리를 풀어보겠습니다.
🔍 1. KMP는 뭘 하려는 걸까?
문자열 T에서 특정 패턴 P를 효율적으로 찾기 위한 알고리즘입니다.
단순 비교는 느릴 수 있으니, 이미 매칭된 정보를 활용해서 뒤로 돌아가지 않고 매칭하는 것이 핵심입니다.
🤖 2. 오토마타처럼 동작한다고?
KMP는 다음과 같은 구조를 가집니다:
- 상태(State): 지금까지 맞은 패턴 접두사의 길이
- 입력(Input): 텍스트에서 들어오는 문자
- 전이 함수(Transition): 다음 상태로 이동하거나 실패 시 fallback
예를 들어 상태 3이면, 패턴 P의 처음 3글자 P[0:3]까지 매칭된 상태입니다. 다음 입력 문자에 따라 상태가 변화하게 되죠.
📐 3. 실패 함수(π 배열)
실패 함수는 매칭이 실패했을 때 어디서 다시 시작할지를 알려주는 배열입니다.
이는 오토마타에서 fallback 경로를 의미합니다.
예) 패턴 P = "ababaca"일 때
π = [0, 0, 1, 2, 3, 0, 1]
예를 들어 상태 4에서 실패했다면, π[4] = 3 → 다시 상태 3부터 시작하는 것입니다.
🧠 4. 전이 오토마타 (DFA 구성 예시)
패턴 P = ababaca에 대한 KMP DFA를 아래와 같이 표현할 수 있습니다.
stateDiagram-v2
[*] --> S0
S0 --> S1: a
S0 --> S0: b/c
S1 --> S2: b
S1 --> S1: a
S1 --> S0: c
S2 --> S3: a
S2 --> S1: b
S2 --> S0: c
S3 --> S4: b
S3 --> S1: a
S3 --> S0: c
S4 --> S5: a
S4 --> S2: b
S4 --> S0: c
S5 --> S6: c
S5 --> S3: a
S5 --> S0: b
S6 --> S7: a
S6 --> S0: b/c
S7 --> [*]: (Match)
각 상태는 "지금까지 얼마나 매칭됐는지"를 기억하고, 다음 입력에 따라 어디로 갈지를 전이합니다. 실패 시에는 π 배열 값에 따라 되돌아가게 됩니다.
📌 요약
- KMP는 오토마타처럼 동작하는 문자열 검색 알고리즘입니다.
- 각 상태는 패턴 접두사 매칭 상태를 의미하며, 입력 문자에 따라 전이합니다.
- 실패 함수(π 배열)는 오토마타의 fallback 경로로 작용하여 불필요한 비교를 줄입니다.

'Tech > Coding' 카테고리의 다른 글
| Suffix Automaton과 KMP 비교 이해 (0) | 2025.05.06 |
|---|---|
| FSM과 DFA, NFA의 개념과 차이 (0) | 2025.05.05 |
| 전이 기반 탐색(Transition-based Search) (0) | 2025.05.05 |
| Suffix Automaton과 Suffix Array (0) | 2025.05.05 |
| 스피드스택 정렬 대결 (0) | 2025.05.04 |