๋ฐ์ํ
๐ค๋ฌธ์ ํด๊ฒฐ
-
G4 | ๋ฌธ์์ด, KMP
๋ฑ ๋ด๋ ๋๋ฌด ์ฝ์ง๋ง G5๋๊น…. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
๋ค์ด๋ ๋ดค์ด๋ ํ ๋ฒ๋ ์จ๋ณธ ์ ์๋ KMP ์๊ณ ๋ฆฌ์ฆ์ ์จ์ผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
KMP๋ฅผ ์ฐ๋ฉด ๋ธ๋ฃจํธํฌ์ค๋ก ๋ฌธ์์ด ํ์ํ๋ ๊ฒ๋ณด๋ค ์์ฃผ ๋น ๋ฅด๋ค. O(M+N)
ํ ์๊ฐ ๋๊ฒ ์ฐพ์๊ฐ๋ฉด์ ๊ณต๋ถํ์ง๋ง ์ค๋ช
ํ๊ธฐ๋ ๋๋ฌด ์ด๋ ต๋ค. ์ดํด๊ฐ ์ ์ ๋๋ค. ๋์ค์ ํ ๋ฒ ๋ ๋ด์ผ๊ฒ ๋ค.
๋์ถฉ ๋งํด๋ณด์๋ฉด
๋น์ทํ ํจํด์ ๊ธฐ์ตํด๋๋ค๊ฐ ํจํด์ ๋ง๋๋ฉด ์ ํ... (๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค)
์ด์งธ ๋๋ ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ง์ด ์ฐ์ด์ง ์์ง๋ง, ์ ๋นํ ์์๋ง ๋๋ฉด ์ข์ ๊ฑฐ ๊ฐ๋ค.
๐ป์์ค ์ฝ๋
def kmp_match(txt: str, pat: str) -> int:
# ์คํตํ
์ด๋ธ ๋ง๋ค๊ธฐ
def make_skip_table(skip: list):
pt = 1 # txt๋ฅผ ๋ฐ๋ผ๊ฐ๋ ์ธ๋ฑ์ค
pp = 0 # pat๋ฅผ ๋ฐ๋ผ๊ฐ๋ ์ธ๋ฑ์ค
while pt < len(pat):
if pat[pt] == pat[pp]:
pt += 1
pp += 1
skip[pt] = pp
elif pp == 0:
pt += 1
skip[pt] = pp
else:
pp = skip[pp]
# ๋ถ๋ถ ๋ฌธ์์ด ์ฐพ๊ธฐ (์ด ๋ฌธ์ ์์๋ ์๋์ง ์๋์ง๋ง ์ฐพ์ผ๋ฉด ๋๋ค.)
def find_match_idx(txt: str, pat: str) -> int:
pt = 0
pp = 0
while pt < len(txt) and pp < len(pat):
if txt[pt] == pat[pp]:
pt += 1
pp += 1
elif pp == 0: # ๋ ์ด์ ์์ผ๋ก ๋์๊ฐ ์ ์๋ ๊ฒฝ์ฐ
pt += 1
else:
pp = skip[pp]
if pp == len(pat):
return 1
else:
return 0
skip = [0] * (len(pat) + 1)
make_skip_table(skip)
answer = find_match_idx(txt, pat)
print(answer)
if __name__ == '__main__':
S = input()
P = input()
kmp_match(S, P)
๐๋ฌธ์ ํ์ธ
์ถ์ฒ: BACKJOON ONLINE JUDGE
๋ฐ์ํ
'Algorithm Problem > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python] ๋ฐฑ์ค - 1655. ๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ (0) | 2020.11.05 |
---|---|
[python] ๋ฐฑ์ค - 1747. ์์&ํฐ๋ฆฐ๋๋กฌ (0) | 2020.11.04 |
[python] SWEA - 10912. ์ธ๋ก์ด ๋ฌธ์ (0) | 2020.11.02 |
[python] SWEA - 10804. ๋ฌธ์์ด์ ๊ฑฐ์ธ์ (0) | 2020.11.01 |
[python] ๋ฐฑ์ค - 1012. ์ ๊ธฐ๋ ๋ฐฐ์ถ (0) | 2020.10.31 |