모두CBT

다음은 텍스트에서 패턴과 일치하는 문자열을 찾기 위한 KMP(Knuth… | [7급 국가직 알고리즘] 24년 1회차 기출문제 상세 페이지

1[7급 국가직 알고리즘] 24년 1회차
다음은 텍스트에서 패턴과 일치하는 문자열을 찾기 위한 KMP(Knuth Morris Pratt) 알고리즘에서의 전처리 과정을 구현한 파이썬 프로그램이다. 패턴이 abcbabca인 경우, 아래 표의 (가) ∼ (라)에 들어갈 숫자를 바르게 연결한 것은?
def preprocess(pn: str):
pt = 1
k = 0
pi = [0] * (len(pn) + 1)
pi[pt-1] = -1
pi[pt] = 0
while pt != len(pn):
if pn[pt] == pn[k]:
k += 1
pt += 1
pi[pt] = k
elif k == 0:
pt += 1
pi[pt] = k
else:
k = pi[k]
print(pi)
pattern = 'abcbabca'
preprocess(pattern)
i012345678
pn[i]abcbabca
pi[i]-10000(가)(나)(다)(라)
(가) (나) (다) (라)
1
1 1 1 1
2
1 2 3 1
3
1 2 3 0
4
3 3 3 0
해설

(가)~(라)는 차례로 1, 2, 3, 1이다.

pi[i]는 패턴 앞 i글자에서 접두사와 접미사가 일치하는 최대 길이이다(pi[0] = -1).

pi[5]: abcba → a 일치 → 1
pi[6]: abcbab → ab 일치 → 2
pi[7]: abcbabc → abc 일치 → 3
pi[8]: abcbabca → 코드에서 pn[7]=a ≠ pn[3]=b라 k = pi[3] = 0으로 돌아간 뒤 pn[7] = pn[0] = a가 일치 → 1

  • 1, 1, 1, 1은 (나)·(다)에서 일치 길이가 ab, abc로 늘어나는 것을 반영하지 않았다.
  • 1, 2, 3, 0은 마지막 a가 첫 글자 a와 일치하는 것을 놓쳤다.
  • 3, 3, 3, 0은 abcba의 접두사·접미사 일치가 a 하나뿐이라 (가)부터 맞지 않는다.

오류나 개정된 내용이 보이면 알려주세요

이어서 풀어보기

[7급 국가직 알고리즘] 24년 1회차 25문항 이어서 보기문제·정답·해설을 한 페이지에서 이어서 볼 수 있어요7급 국가직 알고리즘 기출문제 암기장 전체 보기