브루트포스 알고리즘은 텍스트의 처음부터 끝까지 한 문자씩 비교하며 패턴을 찾는 방식이다. 가장 기본적인 문자열 검색 방법으로, 모든 경우를 일일이 확인하기 때문에 시간 복잡도는 O(nm)이다.
txt)의 첫 번째 문자부터 패턴(pat)과 비교를 시작한다.# 브루트포스 문자열 검색
def bf_match(txt: str, pat: str) -> int:
n = len(txt)
m = len(pat)
for i in range(n - m + 1): # 가능한 모든 위치에서 검사
j = 0
while j < m and txt[i + j] == pat[j]: # 패턴과 비교
j += 1
if j == m: # 패턴이 완전히 일치하면 위치 반환
return i
return -1 # 패턴이 발견되지 않음
보이어-무어 알고리즘은 패턴의 마지막 문자부터 비교하며, 불일치 시 여러 칸을 건너뛸 수 있도록 최적화된 알고리즘이다. 일반적으로 O(n/m)에 가까운 성능을 내며, 긴 텍스트에서 특히 강력한 성능을 발휘한다.
pat = "ABCD", txt = "XXXCXXX"라면, C는 패턴 내에서 세 번째 위치에 있으므로 3-2=1칸 이동한다.pat = "ABCD", txt = "XXXDXXX"라면 이동할 필요가 없으므로 이동량은 m이다.# 보이어-무어 문자열 검색
def preprocess_bad_character(pat: str):
bad_char = {}
m = len(pat)
for i in range(m):
bad_char[pat[i]] = i # 가장 오른쪽에 등장하는 위치 저장
return bad_char
def bm_match(txt: str, pat: str) -> int:
bad_char = preprocess_bad_character(pat)
n, m = len(txt), len(pat)
s = 0
while s <= n - m:
j = m - 1
while j >= 0 and txt[s + j] == pat[j]:
j -= 1
if j < 0:
return s
shift = max(1, j - bad_char.get(txt[s + j], -1))
s += shift
return -1
preprocess_bad_character(pat: str)
pat = "ABCD"라면 { 'A': 0, 'B': 1, 'C': 2, 'D': 3 }가 된다.bm_match(txt: str, pat: str) -> int
bad_char 테이블을 활용하여, 불일치가 발생하면 점프할 거리를 결정한다.while j >= 0 and txt[s + j] == pat[j]에서 오른쪽에서부터 문자를 비교하며 일치하는 경우 j를 감소시킨다.if j < 0:에서 j가 -1이 되면 패턴이 완전히 일치한 것이므로 s 반환.shift = max(1, j - bad_char.get(txt[s + j], -1))에서 배드 문자 규칙을 적용하여 점프할 거리를 결정한다.| 알고리즘 | 시간 복잡도 | 방식 | 특징 |
|---|---|---|---|
| 브루트포스 | O(nm) | 처음부터 한 문자씩 비교 | 구현이 쉽지만 비효율적 |
| 보이어-무어 | O(n/m) (평균) | 패턴 끝에서부터 비교 & 점프 | 긴 텍스트에서 특히 빠름 |
✔ 보이어-무어는 건너뛰기를 최대화하여 빠르게 검색한다! 🚀