๊ตญ๋ฏผ๋ํ๊ต์์ "์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ" ๊ต์ฌ๋ฅผ ์ด์ฉํ
๋ฐํ๋ช ๊ต์๋์ ๊ฐ์ ๊ต์์ ์ด์ฉํ์ฌ ์์ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค
String Matching
๋ฌธ์์์ ๋จ์ด๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ผ๋ ค๋ฉด?
๋ฌธ์์์ ํน์ ๋จ์ด๋ฅผ ๊ฒ์ํด์ ์ฐพ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ํ ๋ฐ
์ด๋ ์ฐพ์ผ๋ ค๋ ๋จ์ด๋ฅผ pattern์ด๋ผ ํจ
์ด๋ ๊ฒ ๋ฌธ์์์ ๋จ์ด๋ฅผ ์ฐพ์ ๋ ๋น ๋ฅด๊ฒ ์ฐพ์ผ๋ ค๋ฉด ์ด๋ค ๋ฐฉ๋ฒ์ ์จ์ผํ ์ง์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์
Problem Definition
์ ๋ ฅ์ ๊ธธ์ด n์ธ ๋ฌธ์ ๋ฌธ์์ด A, ๊ธธ์ด m์ธ ํจํด ๋ฌธ์์ด P ๊ฐ ์ฃผ์ด์ง๊ณ ๋ณดํต n์ด m๋ณด๋ค ํจ์ฌ ํฐ ์ํฉ์
์ด๋ ์ถ๋ ฅ์ ํจํด ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ A์ ๋ถ๋ถ ๋ฌธ์์ด(sub-string) ์์น๋ฅผ ์ถ๋ ฅํ๊ฒ๋จ
Naive Algorithm
๋ฌธ์ A์ ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์์ด์ ์์ฐจ์ ์ผ๋ก ํจํด P์ ๋งค์นํด๋ณด๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํด๋ณผ ์ ์์
Pseudo Code๋ฅผ ๋ณด๋ฉด
์๊ฐ๋ณต์ก๋๊ฐ O(mn)์
- O(n)ํ ๋ฐ๋ณต (์ ํํ๋ n - m + 1 ๋งํผ)
- ๊ฐ ๋ฐ๋ณต๋ง๋ค O(m) ๋ฒ์ ๋ฌธ์ ๋น๊ต
๋ฌธ์์์ ๋จ์ด๋ฅผ O(mn)๋ณด๋ค ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด์๋ KMP Algorithm์ ์ ์ฉํด๋ณผ ์ ์์
KMP Algorithm
ํ์ ์๊ณ ๋ฆฌ์ฆ
KMP ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ ์์ด๋์ด๋ ํจํด์ ์ค๋ณต ๋ถ๋ถ์ ์ฌ์ฌ์ฉํ์ฌ ์ค๋ณต ๋งค์นญ์ ๊ฑด๋๋ฐ๋ ๊ฒ์
์ค๋ณต ๋งค์นญ์ ์ด๋ป๊ฒ ๊ฑด๋๋ธ ์ ์์๊น?
๋ณต๊ตฌ์์น ๋ฐฐ์ด π๋ฅผ ํ์ฉํจ
=> ๋ฌธ์ ๋งค์นญ์ ์คํจํ์ ๋, ๋งค์นญ์ ์ฌ์์ํ ์์น ํ์
๋ง์ฝ ์ ๊ทธ๋ฆผ์์ w๊ฐ ์ผ์นํ์ง ์์์ผ๋ฉด ํด๋น π ๋ฐฐ์ด์ ์ ํ 3๋ฒ index (์ํ๋ฒณ d)๋ฅผ ํ์ฌ w๊ฐ ๋น๊ตํ ์๋ฆฌ์์ ํ์์ ๋ค์ ์์ํ๋ฉด ๋๋ค๋ ์๋ฏธ์
์ฐ์ ๊ทธ๋ฆผ์ผ๋ก 4๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด๋ฉด ์ดํด๊ฐ ์ฌ์
์ฐ์ ๊ฐ๊ฐ ๋ฌธ์์ ํจํด์ ์ฒซ ์์ ์ธ๋ฑ์ค์ ํฌ์ธํฐ i, j๋ฅผ ์์น์ํค๊ณ ์์ํ๋ฉด๋จ
i๊ฐ ๊ฐ๋ฆฌํค๋ x์ j๊ฐ ๊ฐ๋ฆฌํค๋ a๊ฐ ๋ค๋ฅด๊ณ j๊ฐ 0์ ๊ฐ์ ์์นํด์์ผ๋ฉด i๋ฅผ ํ๋ ์ฆ๊ฐ ์ํด
(๋ฌธ์ A์ ๋ค์ ๋ฌธ์์ด์ ์ดํด๋ด)
i๊ฐ ๊ฐ๋ฆฌํค๋ a์ j๊ฐ ๊ฐ๋ฆฌํค๋ a๊ฐ ์ผ์นํ๋ฏ๋ก i์ j๋ฅผ ๋ชจ๋ 1์ฉ ์ฆ๊ฐ์์ผ ๋ค์ ๋ฌธ์๋ฅผ ์ดํด๋ด
=> ์ ๊ทธ๋ฆผ์์๋ abdab๊น์ง ์ผ์นํ ๊ฒ์ ์๊ฐํด๋ณผ ์ ์์
์ฌ๊ธฐ์๋ถํฐ π๋ฐฐ์ด์ด ์ฌ์ฉ๋๋๋ฐ
pseudo code๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด i๊ฐ ๊ฐ๋ฆฌํค๋ 'd' ์ j๊ฐ ๊ฐ๋ฆฌํค๋ 'w'์ ๋ฌธ์๊ฐ ์ผ์นํ์ง ์์ผ๋ฏ๋ก j๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ด 0๋ฒ์ธ์ง ํ์ธํด๋ด
์ ์ํฉ์์๋ j๊ฐ 5๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก π๋ฐฐ์ด์ ํด๋น ์ธ๋ฑ์ค์ ์ ํ 2๋ฒ ์ธ๋ฑ์ค (๋ฌธ์ d)๋ก j๋ฅผ ์ฎ๊ฒจ ํ์ฌ i๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ๋น๊ตํจ
=> ์ผ์นํ๋ฏ๋ก i์ j๊ฐ ๊ฐ๊ฐ 1์ฉ ์ฆ๊ฐํ ๊ฒ์
(๋ค์ ํ์์ด ์์๋ ๊ฒ์ ์ ์ ์์)
i๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์ d์ j๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์ a๊ฐ ์ผ์นํ์ง ์์ ํด๋น ์ธ๋ฑ์ค์ π๋ฐฐ์ด์ ๋ฐ๋ผ 0๋ฒ์งธ ์ธ๋ฑ์ค (๋ฌธ์ a)๋ก ์ด๋ํ์ฌ ํ์ฌ i๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์ d์ ๋น๊ต
์ด ๋ ์ด๊ฒ๋ ์ผ์นํ์ง ์๋๋ฐ j๊ฐ 0๋ฒ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก i๋ฅผ 1 ์ฆ๊ฐ์ํด
์ด๋ ๊ฒ ๊ณ์ ํ์ํ๋ฉด j๊ฐ p์ ๊ธธ์ด์ ๋์ผํด์ง๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์ํฉ์ด ์ค๊ฒ๋๋๋ฐ
์ด๋ฌ๋ฉด ๋งค์น๊ฐ ์ฑ๊ณตํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ j๋ฅผ ๋ค์ ์ด๊ธฐํ ์์ผ ๋ค์ ๋งค์น๋ฅผ ํ์ํจ
์๊ฐํด๋ณผ์
String Match๋ฅผ ํ ๋ 2๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณผ ์ ์์
์์ ๊ฐ์ ๋ฌธ์ A์ P๊ฐ ์ฃผ์ด์ง๋ฉด 2๊ฐ๋ฅผ return ํ ์ง 4๊ฐ๋ฅผ return ํ ์ง์
์ผ๋จ ์์ KMP ์๊ณ ๋ฆฌ์ฆ์ 1๋ฒ์ ๊ฒฝ์ฐ์ฒ๋ผ 2๊ฐ๋ฅผ returnํ๋ ์ฝ๋์
(๋งค์น ์ฑ๊ณต ํ j๋ง ์ด๊ธฐํ ํ๊ณ ๋ค์ ํ์์ ์์ํ๋ฏ๋ก)
๋ฐ์์ฒ๋ผ 4๊ฐ๋ฅผ returnํ๋ ์ํฉ์ฒ๋ผ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด
π๋ฐฐ์ด์ ํ์์ด ๋๋ฌ์ ๋ ๋ค์ ํ์์ ์์ํ ๊ฐ์ ๋ฏธ๋ฆฌ ์ค์ ํด๋์์ผํจ
=> j๊ฐ P์ ๊ธธ์ด๊ฐ ๋์์ ๋ ์ค๊ฐ์ ๋ค์ ํ์์ ์์ํ ๊ฐ์ผ๋ก ๊ฐ ์ ์๊ฒ
Complexity Analysis
๋งค ๋ฐ๋ณต๋ง๋ค i์ j์ ๋ณํ๋ฅผ ๊ด์ฐฐํ์ฌ ์ฆ๋ช ํ ์ ์์
์์์ ๋ค๋ค๋ 4๊ฐ์ง ์ํฉ๋ค์ ์ดํด๋ดค์ ๋
- i์ j๊ฐ ๋์์ 1 ์ฆ๊ฐํจ
- i๋ 1 ์ฆ๊ฐํ๊ณ j๋ 0์ด๋จ
- i๋ง 1 ์ฆ๊ฐํจ
- j๊ฐ π[j]๋ก ๊ฐ์ํจ
์ธ๋ฐ
i + (i - j)๋ ์ต์ํ 1์ฉ ์ฆ๊ฐํจ
i + (i - j)์์ j๋ ์์์ด๋ฏ๋ก <= 2i ์ผํ
๊ณ pseudo code์์ ๋ดค๋ฏ์ด while๋ฌธ์ ์กฐ๊ฑด i < n์ด ์์ผ๋ฏ๋ก
i + (i - j) <= 2i <= 2n ์ด ๋จ
=> ์ฆ, i + (i - j) ๊ฐ 1์์ ์์ํ์ฌ ์ต์ 1์ฉ ์ฆ๊ฐํ๋ฉฐ 2n์ด ๋๊ธฐ์ ์ ๋ฐ๋ณต๋ฌธ์ ์ข
๋ฃํจ
O(2n) = O(n)
๊ฒฐ๊ตญ ์๊ฐ๋ณต์ก๋๋ ์ฐ์ฐ์ ํ์์ธ๋ฐ
i + (i - j)๋ ๊ฐ ์ฐ์ฐ๋ง๋ค ์ต์ํ 1์ฉ ์ฆ๊ฐํ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ฅผ ๊ตฌํ๋ ์งํ๋ก ์ฌ์ฉํ ์ ์์
π ๋ฐฐ์ด ์์ฑ ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ผ π๋ฐฐ์ด์ ์ด๋ป๊ฒ ๊ตฌํ ๊น?
π๋ฐฐ์ด์ LPS ๊ธธ์ด ๋ฐฐ์ด์ ํ ์นธ ์ฎ๊ธด ๊ฒ๊ณผ ๋์ผํจ
=> Longest Prefix Suffix (LPS)๋ ์ฒ์๊ณผ ๋ง์ง๋ง์ด ๊ฒน์น๋ (๋์ผํ) ๋ถ๋ถ์ ์๋ฏธ
pseudo code์ ํจ๊ป π๋ฐฐ์ด์ ๊ตฌํ๋ ๊ณผ์ ์ ์ดํด๋ณด๋ฉด
์ฐ์ ์์ํ ๋ i์ ์ธ๋ฑ์ค๋ 1๋ถํฐ ์งํ์ํจ
=> 0๋ฒ์งธ๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ์ด์ฉํผ ํ์ํ๋ ์ฝ๋์์ ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ๋ฏ๋ก ๋ฐ๋ก ์ด๋๋ก ๊ฐ์ง ๊ฒฐ์ ํ ํ์๊ฐ ์์ด ๋ฐ๋ก 0์ ๋ฃ์
(๋, 0๋ฒ์งธ ๋ถํฐ ์์ํ๋ฉด ํจํด์์ ํจํด์ ์ฐพ์๋ฒ๋ฆฌ๋ ๊ผด์ด ๋๋ฒ๋ฆผ...)
์ด๋ ๊ฒ ์ด๊ธฐ ์ธํ ์ ๋ง์ณค์ผ๋ฉด
LPS์ ๊ธธ์ด ์ฆ, j์ ์์น๋ฅผ ํด๋น π๋ฐฐ์ด์ด ์ธ๋ฑ์ค ์์น์ ์ ์ด์ฃผ๋ฉด ๋จ
i๊ฐ ๊ฐ๋ฆฌํค๋ P์ 1๋ฒ ์ธ๋ฑ์ค ๋ฌธ์ a์ j๊ฐ ๊ฐ๋ฆฌํค๋ 0๋ฒ ์ธ๋ฑ์ค ๋ฌธ์ a๊ฐ ์ผ์นํ๋ฏ๋ก j์ i๋ชจ๋ ์ฆ๊ฐ์ํค๊ณ
j์ ์ธ๋ฑ์ค ์์น๋ฅผ i๊ฐ ๊ฐ๋ฆฌํค๋ ์ธ๋ฑ์ค๋ก π๋ฐฐ์ด์ ๊ฐ์ ๋ฃ์ด์ค
i๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์ b์ j๊ฐ ๊ฐ๋ฆฌํค๋ ์ธ๋ฑ์ค 1๋ฒ ๋ฌธ์ a๊ฐ ๋ค๋ฅด๋ฏ๋ก
π๋ฐฐ์ด์ ๋ฐ๋ผ 0๋ฒ์ผ๋ก ์ด๋ํด์ ๋ค์ ํ์ธํด๋ณด๊ณ ๋ ๋ค๋ฅด๋ฏ๋ก ์ฝ๋์ ์ํด i๋ฅผ ํ๋ ์ฆ๊ฐ์ํฌ ๊ฒ์
์ด๋ฐ์์ผ๋ก ๋ฐ๋ณต๋๋ฉฐ ์งํ๋จ
์๊ฐํด๋ณผ์
์๊น String Match๋ฅผ ์ด๋ป๊ฒ ํ ์ง์ ๋ํด 2๊ฐ์ง๋ฅผ ์ด์ผ๊ธฐํ์๋๋ฐ
ํ์ฌ ํฌ์คํ ํ๋ kmp ์๊ณ ๋ฆฌ์ฆ์ ์์ ๋ด์ฉ์ค 1๋ฒ ๋ฐฉ์์ ํด๋นํ๋ String Match๋ฅผ ์งํํ๋ค๊ณ ํ์์
๋ง์ฝ 2๋ฒ ๋ฐฉ์์ผ๋ก String Match ํ๋ KMP ์๊ณ ๋ฆฌ์ฆ์ π๋ฐฐ์ด์ ํ์์ด ๋๋ฌ์ ๋ ๋ค์ ํ์์ ์์ํ ๊ฐ์ ๋ฏธ๋ฆฌ ์ค์ ํด๋์์ผ ํ๋๋ฐ
์ด ๋๋ π๋ฐฐ์ด ์์ฑํ ๋ while๋ฌธ์ ์กฐ๊ฑด์ i < m - 1์ด ์๋๋ผ i < m์ผ๋ก ํด์ผํจ!
์ ์ด๋ ๊ฒ ์งํ์ด ๋๋๊ฑธ๊น?
์ดํด๊ฐ ์ด๋ ค์ธ ์ ์๋๋ฐ ๊ฒฐ๊ตญ π๋ฐฐ์ด์ ์์ฑํ๋ ๊ณผ์ ์ LPS์ ๊ธธ์ด ๋ฐฐ์ด์ ํ ์นธ ์ฎ๊ธด๊ฑฐ๋ผ๋ ๊ฒ์ ์ง์คํ๋ฉด๋จ
์ด์ฉํผ ํ์๊ณผ์ ์ ์ดํด๋ดค์ ๋ π๋ฐฐ์ด์์ 0๋ฒ์งธ ์ธ๋ฑ์ค๋ 0์ผ๋ก ๊ฐ๋ ์ ํ์ง ๋ฐ์ ์์ผ๋ฏ๋ก ํฌ์ธํฐ i๋ฅผ 1๋ฒ ์ธ๋ฑ์ค ๋ถํฐ ์์ํจ
๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์ ์ ๋๋ i๋ฅผ ๋จผ์ 1 ์ฆ๊ฐ์ํค๊ณ ํด๋น π๋ฐฐ์ด ์๋ฆฌ์ ๊ฐ์ ์ ์ด์ค์ผ LPS์ ๊ธธ์ด ๋ฐฐ์ด์ ํ ์นธ ์ฎ๊ธด ํจ๊ณผ๊ฐ ๋ํ๋จ
=> ์ฌ๊ธฐ์ i๋ ํ์ฌ ๊ธธ์ด์ ๋ฐฐ์ด์์ ๋ท๋ถ๋ถ, j๋ ์ด์ ์ธ๋ฑ์ค๋ค์ ๊ธธ์ด ์ฆ, ์๋ถ๋ถ์ ์๋ฏธํ๋ฏ๋ก ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ๊ธฐ์ ์ j ์์น๋ฅผ + 1 ์ํจ๊ฒ ๊ณง ํด๋น LPS์ ๊ธธ์ด๊ฐ ๋๋๊ฑฐ์
Complexity Analysis
π ๋ฐฐ์ด ์์ฑ ์๊ฐ ๋ณต์ก๋๋ O(m) ์
=> ์์ ๋ค๋ค๋ ํ์ ์๊ฐ ๋ณต์ก๋์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฆ๋ช ๋จ
๋ฐ๋ผ์ ์์ ๊ตฌํ๋ ํ์ ์๊ฐ ๋ณต์ก๋ O(n)๊ณผ ๋ํ๋ฉด
KMP์ ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ O(m + n)์ด ๋จ
'๐ฅ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
L16 - NP-Completeness (1) (0) | 2024.12.03 |
---|---|
L15 - Boyer-Moore Algorithm (0) | 2024.11.30 |
L13 - Topological Sorting (0) | 2024.11.29 |
L12 - Single Source Shortest Paths (0) | 2024.11.28 |
L11 - Minimum Spanning Trees (0) | 2024.11.26 |