ํฐ์คํ ๋ฆฌ ๋ทฐ
[๋ฌธ์์ด ๊ฒ์] ํ ์ด๋ ์ดํดํ๋ KMP ์๊ณ ๋ฆฌ์ฆ
10000COW 2022. 12. 6. 14:51KMP ์๊ณ ๋ฆฌ์ฆ์ด๋?
๋ํ์ ์ธ ๋ฌธ์์ด ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ
KMP ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ ์๋ฆฌ
๋ฌธ์์ด ๋งค์นญ์ ํ๋ฉด์ ํ ์คํธ(์ ์ฒด ๋ฌธ์์ด)์ ํจํด(์ฐพ๋ ๋ฌธ์์ด)์์ ์๋ก ๋ค๋ฅธ ๊ธ์๊ฐ ๋์๋ค๋ฉด,
'์๋ก ๋ค๋ฅธ ๊ธ์์ ๋ฐ๋ก ์ ๊น์ง๋ ์ผ์นํ๋ค'๋ผ๋ ์ฌ์ค๊ณผ '์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ ๊ฐ์ ๋งํผ ๋น๊ต๋ฅผ ๋ํด๋ ๋๋ค'๋ ์ฌ์ค ์ด์ฉํ๊ธฐ
์ฆ, ๋ฐ๋ก ์ ๊ธ์๊น์ง ์ผ์นํ์์ผ๋ฏ๋ก, ์ ๋ฏธ์ฌ์ ์ ๋์ฌ๊ฐ ๊ฐ์๋งํผ ๋น๊ต๋ฅผ ๋ํ๋๋ก ์ด๋์์ผ์ฃผ๋ฉด ๋๋ค.
์ง์ ํ๋ํ๋ ์ดํดํด๋ณด๊ธฐ
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ์ดํดํด๋ณด์.
@ @ @ @ a b c d a b c d @ @ @ @ ์ธ ํ ์คํธ์์, (@๋ ์๋ฌด ๊ธ์๋ผ๊ณ ์๊ฐํ์, ์ ๊ฒฝ์์จ๋ ๋๋ค.)
a b c d a b c w z ์ธ ํจํด์ ์ฐพ๋๋ค๊ณ ํด๋ณด์.
์ฒซ ๋ฌธ์๋ถํฐ ํ๋ ํ๋ ๋น๊ต๋ฅผ ์์ํ๋ค.
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z @ @ @ @
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z@ @ @ @
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z @ @ @ @
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z
์์๋๋ก ๋น๊ต๋ฅผ ํ๋ค๊ฐ ํ ์คํธ์ ๋ฌธ์(d)์ ํจํด์ ๋ฌธ์(w)๊ฐ ๋ค๋ฅด๋ค!
์ด๋ฐ ์ํฉ์์ KMP ์๊ณ ๋ฆฌ์ฆ์ด ๋น์ ๋ฐํ๋ค.
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z
์์ ๋งํ๋ KMP ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ด์ฉํด๋ณด์.
1. '์๋ก ๋ค๋ฅธ ๊ธ์์ ๋ฐ๋ก ์ ๊น์ง๋ ์ผ์นํ๋ค'๋ผ๋ ์ฌ์ค
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z
์์์ ๋น๊ตํ ํ๋ ๋ถ๋ถ๊น์ง๋ ์ผ์นํ๋ค. ์ฆ, w์ ๋ฐ๋ก ์ ๊น์ง๋ ๋น๊ตํ๋ฉด์ ๋ค๋ฅธ ๋ถ๋ถ์ด ์์๋ค!
์ด ์ฌ์ค์ ๋ช ์ฌํ ์ํ์์,
2. '์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ ๊ฐ์ ๋งํผ ๋น๊ต๋ฅผ ๋ํด๋ ๋๋ค'๋ ์ฌ์ค
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z
ํ์ฌ ํจํด์ ์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ abc๋ก ๊ฐ๋ค
๋ฐ๋ก ์ ๋ถ๋ถ์์ ๋ดค๋ฏ์ด, w ์ ๊น์ง๋ ๋ชจ๋ ์ผ์นํ๋ค.
๊ทธ๋ ๋ค๋ฉด!!!! ์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ ๊ฐ์ ๋งํผ ๋น๊ต๋ฅผ ๋ํด๋ ๋๊ฒ ๋ค
=
์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ ๊ฐ์ผ๋๊น(abc),
์ ๋์ฌ(์์ ์๋ abc)๋ฅผ ์ ๋ฏธ์ฌ(๋ค์ ์๋ abc)๊ฐ ์๋ ์์น์ ๋์ผ๋ฉด ๋๊ฒ ๋ค!
@ @ @ @ a b c d a b c d @ @ @ @
@ @ @ @ a b c d a b c w z
@ @ @ @-------> a b c d a b c w z
์ฆ, ์ด๋ ๊ฒ ๋๋ค. (๋๊ฐ์ ์ํฉ์ ๊ทธ๋ฆผ์ผ๋ก ํํํ ๊ฒ์ด๋ค)
์ด ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ์ผ๋ฉด KMP ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๋ค๊ณ ๋ณด๋ฉด๋๋ค.
ํ ์คํธ์ ํจํด์ ๋ฌธ์๊ฐ ๋ค๋ฅผ ๋๋ง๋ค ํ ์นธ์ฉ ์ด๋ํด์ ๋น๊ตํ๋ ๋จ์ ๋ฌธ์์ด ๊ฒ์๊ณผ๋ ๋ฌ๋ฆฌ
1. '์๋ก ๋ค๋ฅธ ๊ธ์์ ๋ฐ๋ก ์ ๊น์ง๋ ์ผ์นํ๋ค'๋ผ๋ ์ฌ์ค
2. '์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ ๊ฐ์ ๋งํผ ๋น๊ต๋ฅผ ๋ํด๋ ๋๋ค'๋ ์ฌ์ค
์ด ์ฌ์ค๋ค์ ์ด์ฉํด ๋น๊ตํ๋ ํ์๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ด๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฉด ํต์ฌ ์๋ฆฌ๋ฅผ ๋ฐํ์ผ๋ก ๋ฌธ์์ด ๊ฒ์์ ํ๋ฒ์ ์ผ๋ก ๊ฐ์ํด๋ณด์. (์๋ ๊ฐ์๋งํ์ง ๋ง๊ณ ๋ฐ๋ผ๊ฐ๋ฉด์ ์๊ฐํด๋ณด์.)
ํ ์คํธ "a b a c a a b a c c a b a c a b a a " ์์
ํจํด "a b a c a b"๋ฅผ ์ฐพ์๋ณด์
์ฝ๋๋ก ๊ตฌํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ฌ๋์ ์์ ๊ทธ๋ฆผ๋ค ์ฒ๋ผ ์์ผ๋ก ์ฎ๊ฒจ ๊ฐ๋ฉด์ ์๊ฐํ ์ ์์ง๋ง, ์ปดํจํฐ๋ ์ด ๋ฐฉ์์ผ๋ก ์ดํดํ ์๋ ์์ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ฝ๋๋ก ๊ตฌํํ ๋๋ ํ ์คํธ์ ํจํด์ ๊ฐ๊ฐ ํฌ์ธํฐ๋ฅผ ๋๊ณ , ํฌ์ธํฐ๋ฅผ ์ฎ๊ฒจ ๊ฐ๋ฉด์ ๋น๊ตํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
์ฝ๋๋ก ๋ณด๊ธฐ ์ ์ ๊ทธ๋ฆผ์ผ๋ก ์ปดํจํฐ๊ฐ ์ดํดํ๋ ๋ฐฉ์์ ์ดํดํด๋ณด์.
ํ ์คํธ์ ํฌ์ธํฐ์ ํจํด์ ํฌ์ธํฐ๋ก ๋ฌธ์๋ฅผ ๋น๊ตํ๋ฉด์, ์๋ก ๋ค๋ฅธ ๋ฌธ์๊ฐ ๋์ค๋ฉด
ํจํด์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ง์ ์ ๋ฐ๋ก ์ ๋ฌธ์๊ฐ ๊ฐ๋ฆฌํค๋ ์คํจํจ์ ๊ฐ(์ฃผํฉ์ ์ซ์)์ ์ด์ฉํด, ๊ทธ ๊ฐ์ ์ธ๋ฑ์ค๋ก ๊ฐ๋ ๋ฌธ์๋ก ์ด๋ํ๋ค.
์คํจ ํจ์์ ๋ํด ํฌ์คํ ์ ๋ฐ๋ก ํ ์์ ์ธ๋ฐ, ์คํจ ํจ์๋ ์ฃผํฉ์ ์ซ์๋ค์ด๋ฉฐ ํด๋น ๋ฌธ์๊น์ง ๋์ค๋ ์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ ๊ฐ์ ์ต๋ ๊ธธ์ด์ด๋ค.
์ด์ ์ด ๋ฐฉ์์ ์ฝ๋๋ก ๊ตฌํํ ์ฝ๋๋ฅผ ๋ณด์. (makeTable์ ์คํจ ํจ์๋ฅผ ๋ง๋๋ ์ฝ๋์ธ๋ฐ, ์ด ๋ถ๋ถ์ ๊ณง ์ถ๊ฐ๋ก ํฌ์คํ ํ ์์ .)
def makeTable(pattern):
patternSize = len(pattern)
table = [0 for i in range(patternSize)]
j = 0
for i in range (1, patternSize):
while(j >0 and pattern[i] != pattern[j]):
j = table[j-1]
if(pattern[i] == pattern[j]):
table[i] = j+1
j += 1
return table
def KMP(parent, pattern):
table = makeTable(pattern)
parentSize = len(parent)
patternSize = len(pattern)
parentPointer = 0
patternPointer = 0
count = 0
for parentPointer in range(0, parentSize):
while(patternPointer > 0 and parent[parentPointer] != pattern[patternPointer]):
patternPointer = table[patternPointer - 1]
if(parent[parentPointer] == pattern[patternPointer]):
if(patternPointer == patternSize - 1):
print(pattern, "์", parent,"์์ ์ฐพ์์ต๋๋ค.")
count += 1
print("์ด", count, " ๋ฒ ๋์ต๋๋ค")
patternPointer = table[patternPointer]
else:
patternPointer += 1
if count == 0:
print("ํด๋น ๋ฌธ์์ด์ด ์์ต๋๋ค.")
return count
KMP("abacaabaccabacabaa", "abacab")
๊ตฌํ ๊ฒฐ๊ณผ
abacab ์ abacaabaccabacabaa ์์ ์ฐพ์์ต๋๋ค.
์ด 1 ๋ฒ ๋์ต๋๋ค
์๊ฐ ๋ณต์ก๋
ํ ์คํธ(๋ถ๋ชจ)์ ๊ธธ์ด๋ฅผ N, ์ฐพ๋ ๋ฌธ์์ด(ํจํด)์ ๊ธธ์ด๋ฅผ M์ด๋ผ ํ ๋
๋ฌธ์์ด์ ํ ์นธ์ฉ ์ด๋ํ๋ฉด์ ๋ชจ๋ ๋น๊ตํ๋ '๋จ์ ๋ฌธ์์ด ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ'์ด ์๊ฐ ๋ณต์ก๋๊ฐ O(NM)์ธ ๊ฒ์ ๋นํด
'KMP ์๊ณ ๋ฆฌ์ฆ'์ O(N+M)์ ๋ฌธ์์ด ๊ฒ์์ด ๊ฐ๋ฅํ๋ค.
- Total
- Today
- Yesterday
- React Query
- Context API
- react
- ํจ์
- ๋ธ๋ผ์ฐ์
- error
- JavaScript
- CSS
- DOM
- ํ์ด์ฌ
- state
- useState
- mdn
- ์๊ณ ๋ฆฌ์ฆ
- DB
- git
- Browser
- BOJ
- ๋ฆฌ์กํธ
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๊ทธ๋ํ
- Python
- zustand
- ์๋ฃ๊ตฌ์กฐ
- Component
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ ๋ ฌ
- leetcode
- github
- ์๋ฌ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |