๐ฉ LCS, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด Longest Common Subsequence (cf. Longest Common Substring ์ต์ฅ ๊ณตํต ๋ฌธ์์ด)
์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ ๊ฒฝ์ฐ, ๋ถ๋ถ์์ด์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์ฌ์ด๋ฅผ ๊ฑด๋๋ฐ์ด ๊ณตํต๋๋ฉด์ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ๋ฌธ์์ด์ ์ฐพ์ผ๋ฉด ๋๋ค.
์ต์ฅ ๊ณตํต ๋ฌธ์์ด์ ๊ฒฝ์ฐ, ๋ถ๋ถ ๋ฌธ์์ด์ด ์๋๊ธฐ ๋๋ฌธ์, ํ ๋ฒ์ ์ด์ด์ ธ ์๋ ๋ฌธ์์ด๋ง ๊ฐ๋ฅํ๋ค.
๐ฉ ์ต์ฅ ๊ณตํต ๋ฌธ์์ด
if i == 0 or j == 0: # ๋ง์ง ์ค์
LCS[i][j] = 0
elif string_A[i] == string_B[j]:
LCS[i][j] = LCS[i - 1][j - 1] + 1
else:
LCS[i][j] = 0
LCS๋ผ๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ๋ ๋ฌธ์์ด์ ํ, ์ด์ ๋งค์นญํ๋ค. ํธ์์ i, j๊ฐ 0์ผ ๋๋ ๋ชจ๋ 0์ ๋ฃ์ด์ค ๋ง์ง๊ฐ์ ์ค์ ํ๋ค. ์ดํ i, j๊ฐ 1์ด์์ผ ๋๋ถํฐ ๊ฒ์ฌ๋ฅผ ์์ํ๋ค.
1. ๋ฌธ์์ด A, B์ ํ๊ธ์์ฉ ๋น๊ตํ๋ค.
2. ๋ ๋ฌธ์๊ฐ ๋ค๋ฅด๋ค๋ฉด LCS[i][j]์ 0์ ํ์ํ๋ค.
3. ๋ ๋ฌธ์๊ฐ ๊ฐ๋ค๋ฉด LCS[i-1][j-1] ๊ฐ์ ์ฐพ์ +1 ํ๋ค.
4. ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๊ณตํต ๋ฌธ์์ด์ ์ฐ์๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ๊ณผ์ ์ด ์ฑ๋ฆฝ๋๋ค. ํ์ฌ ๋ ๋ฌธ์๊ฐ ๊ฐ์ ๋ ๋ ๋ฌธ์์ ์ ๊ธ์๊น์ง๊ฐ ๊ณตํต ๋ฌธ์์ด์ด๋ผ๋ฉด ๊ณ์ ๊ณตํต ๋ฌธ์์ด์ด ์ด์ด์ง ๊ฒ์ด๊ณ , ์๋๋ผ๋ฉด ๋ณธ์ธ๋ถํฐ ๋ค์ ๊ณตํต ๋ฌธ์์ด์ ๋ง๋ค์ด ๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
๐ฉ ๊ตฌํ๊ณผ์
๐ฉ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด
if i == 0 or j == 0: # ๋ง์ง ์ค์
LCS[i][j] = 0
elif string_A[i] == string_B[j]:
LCS[i][j] = LCS[i - 1][j - 1] + 1
else:
LCS[i][j] = max(LCS[i - 1][j], LCS[i][j - 1])
1. ๋ฌธ์์ด A, B์ ํ๊ธ์์ฉ ๋น๊ตํ๋ค.
2. ๋ ๋ฌธ์๊ฐ ๋ค๋ฅด๋ค๋ฉด LCS[i - 1][j]์ LCS[i][j - 1] ์ค์ ํฐ ๊ฐ์ ํ์ํ๋ค.
3. ๋ ๋ฌธ์๊ฐ ๊ฐ๋ค๋ฉด LCS[i - 1][j -1] ๊ฐ์ ์ฐพ์ +1 ํ๋ค.
4. ์ ๊ณผ์ ๋ฐ๋ณตํ๋ค.
์ต์ฅ ๊ณตํต ๋ฌธ์์ด๊ณผ ๋ค๋ฅธ ๋ถ๋ถ์ ๋น๊ตํ๋ ๋ ๋ฌธ์๊ฐ ๋ค๋ฅผ ๋์ด๋ค. ๋น๊ตํ๋ ๋ ๋ฌธ์๊ฐ ๊ฐ์ ๋๋ ๊ฐ์ ๊ณผ์ ์ ๋ณด์ฌ์ค๋ค.
๋ถ๋ถ ์์ด์ ์ฐ์๋ ๊ฐ์ด ์๋๋ค. ๋๋ฌธ์ ํ์ฌ์ ๋ฌธ์๋ฅผ ๋น๊ตํ๋ ๊ณผ์ ์ด์ ์ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด์ ๊ณ์ํด์ ์ ์งํ๋ค. 'ํ์ฌ์ ๋ฌธ์๋ฅผ ๋น๊ตํ๋ ๊ณผ์ ' ์ด์ ์ ๊ณผ์ ์ด ๋ฐ๋ก LCS[i-1][j]์ LCS[i][j-1]์ด ๋๋ค.
๐ LCS[i-1][j]์ LCS[i][j-1] ์ ์๋ฏธ
๋ฌธ์์ด AB์ GBC๋ฅผ ๋น๊ตํ๋ ๊ณผ์ ์ ์๋ก ๋ ๋ค๋ฉด, AB์ GBC์ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด์ด B๋ผ๋ ๊ฒ์ ์๊ธฐ ์ํด์๋ ๋ฌธ์์ด A์ GBC๋ฅผ ๋น๊ตํ๋ ๊ณผ์ , ๋ฌธ์์ด AB์ GB๋ฅผ ๋น๊ตํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ๋ฌธ์์ด AB์ GB์ ๋น๊ต ๊ณผ์ ์์ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด์ด B์์ ํ์ธํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด AB์ GBC์ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด ์ญ์ B๊ฐ ๋๋ค.
๐ ์ ๋ฌธ์๊ฐ ๊ฐ์ผ๋ฉด LCS[i][j] = LCS[i-1][j-1] +1์ธ๊ฐ?
๋ถ๋ถ ์์ด์ ์ฐ์๋ ํ์๊ฐ ์๋ค. ๋ ๋ฌธ์๊ฐ ๊ฐ์ ์ํฉ์ด ์ค๋ฉด ์ง๊ธ๊น์ง์ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด์ 1์ ๋ํด์ฃผ๋ ๊ฒ
๋ฌธ์์ด ABC์ GBC๋ฅผ ๋น๊ตํ๋ ๊ณผ์ ์ ์๋ก ๋ค์๋ฉด, LCS ๋ฐฐ์ด์ LCS[i-1][j]์ LCS[i][j-1]์ ๋น๊ต๋ฅผ ํตํด ์ธ์ ๋ ๋ณธ์ธ๊น์ง์ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. ๋ฌธ์์ด AB์ GB๋ฅผ ๋น๊ตํ ๋์ ๋ฌธ์์ด ABC์ GBC๋ฅผ ๋น๊ตํ ๋ ๋ฌ๋ผ์ง ์ ์ ๋ ๋ฌธ์์ด ๋ชจ๋์ C๊ฐ ์ถ๊ฐ๋ ์ ์ด๋ค. ๋๋ฌธ์ ๊ธฐ์กด์ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด์ธ B์ C๋ฅผ ๋ํ BC๊ฐ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด์ด ๋๋ค.
๐ฉ ๊ตฌํ๊ณผ์
๐ฉ ์๊ฐ๋ณต์ก๋
๊ธธ์ด n๊ณผ m์ธ ๋ ์คํธ๋ง์ LCS ๊ธธ์ด ๐ O(nm)
๊ฐ๊ฐ ๊ธธ์ด n๊ณผ m์ ์ฌ์ฉํ๋ ์ค์ฒฉ๋ ์ด์ค ๋ฃจํ
ํ ์ด๋ธ LCS[][]๋ก๋ถํฐ LCS๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ ๐ O(n+m)
idx๊ฐ LCS ๊ธธ์ด๋งํผ ์ค์ด๋ค ๋๊น์ง ๋ฐ๋ณตํ๋ ํํ์ ๋ฃจํ๋ก ๊ตฌ์ฑ
์ค์ ๋ก๋ i=n, j=m๋ถํฐ ์ต๋ i=0, j=0๊น์ง ๋๋ฌ ๊ฐ๋ฅ
๐ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด ์ฐพ๊ธฐ
์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋
1. LCS ๋ฐฐ์ด์ ๊ฐ์ฅ ๋ง์ง๋ง ๊ฐ์์ ์์ํ๋ค. ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ result ๋ฐฐ์ด์ ์ค๋นํ๋ค.
2. LCS[i-1][j]์ LCS[i][j-1] ์ค ํ์ฌ ๊ฐ๊ณผ ๊ฐ์ ๊ฐ์ ์ฐพ๋๋ค.
๐ 2-1. ๋ง์ฝ ๊ฐ์ ๊ฐ์ด ์๋ค๋ฉด, ํด๋น ๊ฐ์ผ๋ก ์ด๋
๐ 2-2. ๋ง์ฝ ๊ฐ์ ๊ฐ์ด ์๋ค๋ฉด, result ๋ฐฐ์ด์ ํด๋น ๋ฌธ์๋ฅผ ๋ฃ๊ณ , LCS[i-1][j-1]๋ก ์ด๋ํ๋ค.
3. 2๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๊ฐ 0์ผ๋ก ์ด๋ํ๊ฒ ๋๋ฉด ์ข ๋ฃํ๋ค. result ๋ฐฐ์ด์ ์ญ์์ด LCS์ด๋ค.
์๋ฃ ์ถ์ฒ
'๐ฉโ๐ป ํ๋ก๊ทธ๋๋ฐ > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ผ๋น-์นดํ ์๊ณ ๋ฆฌ์ฆ (0) | 2024.05.05 |
---|---|
๋ธ๋ฃจํธ-ํฌ์ค ์๊ณ ๋ฆฌ์ฆ (0) | 2024.05.05 |
ํ๋ ฌ์ ์ฐ์์ ๊ณฑ์ (0) | 2024.04.29 |
ํฌ๋-ํ์ปค์จ ์๊ณ ๋ฆฌ์ฆ(์ต๋ ์ ๋ ๋ฌธ์ ) (3) | 2024.04.19 |
ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ(์ต๋จ ๊ฒฝ๋ก) (0) | 2024.04.19 |