ํฐ์คํ ๋ฆฌ ๋ทฐ
ํ ์ด๋ ์ดํดํ๋ ๋ฐฑ์ค 9251๋ฒ LCS [DP][Python]
10000COW 2023. 1. 15. 22:17๋ฌธ์
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
ACAYKP
CAPCAK
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
4
๋ฌธ์ ์ ํ
DP
๋ฌธ์ ํ์ด
๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์
ํ ๋ฌธ์์ด์ ๊ธฐ์ค์ผ๋ก ์ก๊ณ , ํ ๊ธ์์ฉ ์ถ๊ฐํ๋ฉด์ ์ง๊ธ๊น์ง์ ๋ถ๋ถ ๋ฌธ์์ด์ 'LCS(์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)'์ด ๋ช ๊ฐ์ธ์ง ๊ธฐ๋กํด๋๊ฐ๋ค.
์ฃผ์ด์ง ์ฒซ ๋ฒ์งธ ๋ฌธ์์ด์ sub suquence๋ฅผ S1, ๋ ๋ฒ์งธ ๋ฌธ์์ด์ sub sequence๋ฅผ S2๋ผ๊ณ ํ์ ๋,
S1๋ฅผ ๊ธฐ์ค์ผ๋ก ์ก๊ณ , S2์ ๋ฌธ์๋ฅผ ํ๋์ฉ ๋๋ ค๊ฐ๋ฉด์ ๋น๊ตํ๋ค.
ํ๋ ํ๋ ํด๋ณด๊ธฐ
๋จ์ํ๊ฒ ์๊ฐํด๋ณด๋ฉด, ๋ฌธ์๋ฅผ ๋น๊ตํ๋ฉด์ ๊ฐ์ ๊ธ์๊ฐ ๋์ค๋ฉด ์ฐ์ LCS์ +1์ ํด์ฃผ๋ ๊ฒ์ด ๋ง๋ค๊ณ ์๊ฐ์ด ๋ ๋ค.
๊ทธ๋ฐ๋ฐ,
S1: A
S2: CA
S1: A
S2: CAPCA
์ ๊ฐ์ ์ํฉ์ ๋ดค์ ๋, ๋ฌธ์๊ฐ ๊ฐ๋ค๊ณ ๋ฌด์กฐ๊ฑด +1์ ํด์ฃผ๋ ๋จ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋
+1์ ํด์ผํ๋๋ฐ ์ค๋ณต์ผ๋ก +2๊ฐ ๋ ์ ์์ผ๋ฏ๋ก, ์กฐ๊ธ ๋ ์๊ฐ์ ํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
ํ ๋ฐํด๋ฅผ ์ง์ ๋ ์งํํด๋ณด์.
S1: AC
S2: C
S1: AC
S2: CAPC
๋ ์ํฉ์์ S1์ C์ S2์ C๊ฐ ๊ฐ๋ค.
์ด ์ํฉ์์ ์ด๋ป๊ฒ LCS์ +1์ ํด์ค์ผํ ๊น?
'๋น๊ตํ๋ ๊ธ์๊ฐ ์๊ธฐ ๋ฐ๋ก ์ ๊น์ง์ LCS' + ( if ํ์ฌ ๋ฌธ์๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ผ๋ฉด 1, ๋ค๋ฅด๋ฉด 0)
์ ํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
S1: AC
S2: CAPC
์ ๋ฐ๋ก ์ด์ ๊น์ง์ LCS๋
ํ์ฌ ๋น๊ตํ๊ณ ์๋ C๊ฐ ์๊ธฐ ์ ์ธ
S1: A
S2: CAP
๊น์ง์ LCS์ด๋ค.
๋ฐ๋ผ์, ํ์ฌ ๋ฌธ์๋ฅผ ๋น๊ตํ์ ๋ ๊ฐ๋ค๋ฉด ๋ฐ๋ก ์ด์ ๊น์ง์ LCS์ +1 ์ ํด์ฃผ๊ณ ,
๊ฐ์ง ์๋ค๋ฉด, ๋น๊ต ์ด์ ๊น์ง์ LCS๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉด ๋๋ค.
์ฆ, ํ์ฌ ์์น ๊ธฐ์ค LCS๋ ์ด์ LCS์ + 1์ ๋ํ๊ฑฐ๋, ๋ํ์ง ์๊ฑฐ๋ ๋ ๊ฐ์ง ์ค ํ ๊ฐ์ง๊ฐ ๋๋ค.
์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ์์ ๋ง๋ค ์ ์์ผ๋ฉฐ,
๊ฐ ๋ถ๋ถ์์ ์ด์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ํด๋น ์ต์ ๊ฒฐ๊ณผ๊ฐ์ด ๊ทธ๋๋ก ์ฌ์ฉ๋๋
DP์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ธ Overlapping Subproblems์ Optimal Substructure๋ฅผ ๋ง์กฑํ๋ค.
์ด ๋ฌธ์ ์์๋ ๋ฌธ์๋ฅผ ํ๋์ฉ ์ฆ๊ฐ์ํค๋ฉฐ ๋น๊ตํ๊ณ ์์ผ๋ฏ๋ก,
๋ ๋ฌธ์์ด๋ก 2์ฐจ์ ํ๋ ฌ์ ๋ง๋ค์ด ํ๋ก ๋ณด๋ ๊ฒ์ด ๊ท์น์ ์ฐพ๊ณ ์ ํ์์ ๋ง๋ค๋ ๋์ฑ ํธํ๋ค.
2์ฐจ์ ํ๋ ฌ๋ก lcs[i][j] ๋ผ๊ณ ํํํ ๋, ๋ฐ๋ก ์ด์ ๊น์ง์ LCS๋ lcs[i-1][j-1] ์์ ์ ์ ์๋ค.
๋ฐ๋ผ์ ๋น๊ตํ ๋ฌธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ,
lcs[i][j] = lcs[i-1][j-1] + 1
์ด๋ผ๊ณ ์ ํ์์ ์ธ์ธ ์ ์๊ฒ ๋ค.
๊ทธ๋ ๋ค๋ฉด, ๋๋จธ์ง ๊ฒฝ์ฐ์ธ ๋น๊ตํ ๋ฌธ์๊ฐ ๊ฐ์ง ์์ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ์ ํ์์ ์ธ์ธ ์ ์์๊น?
S1: AC
S2: CAPCA
๋ฅผ ์๋ฅผ ๋ค์ด๋ณด์,
C์ A๋ ๋น๊ตํ์ ๋ ๋ฌธ์๊ฐ ๊ฐ์ง ์์ผ๋ฏ๋ก,
๊ฐ๊ฐ ๋ ๋ฌธ์๋ฅผ ๋น๊ตํ๊ธฐ ์ ์ธ
S1: AC
S2: CAPC
์ผ ๋์ LCS๋
S1: A
S2: CAPCA
์ผ ๋์ LCS ์ค์์
์ฆ, ๊ธฐ์กด์ ์ฃผ์ด์ง ๋ฌธ์์ด๋ก ๋ง๋ค ์ ์๋ LCS ์ค ์ต๋ LCS๋ฅผ ๊ฐ์ง๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๋ฐ๋ผ์ ๋น๊ตํ ๋ฌธ์๊ฐ ๊ฐ์ง ์์ ๊ฒฝ์ฐ๋ ์ ํ์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
lcs[i][j] = max( lcs[i-1][j], lcs[i][j-1] )
์ ๋ฆฌํด ๋ณด๋ฉด, ์ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค.
โ
๋น๊ตํ ๋ฌธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ,
lcs[i][j] = lcs[i-1][j-1] + 1
โ
๋น๊ตํ ๋ฌธ์๊ฐ ๊ฐ์ง ์์ ๊ฒฝ์ฐ,
lcs[i][j] = max( lcs[i-1][j], lcs[i][j-1] )
DP ๋จ๊ณ๋ณ๋ก ํ์ด๋๊ฐ๊ธฐ
1๏ธโฃ DP๋ก ํ ์ ์๋ ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ
๐ฝ
2๏ธโฃ ๋ฌธ์ ์ ๋ณ์ ํ์ ํ๊ธฐ
์ ์
: lcs[i][j] = ๋ฌธ์ ์์น [i][j]์์์ LCS
๐ฝ
3๏ธโฃ ์ ํ์ ๋ง๋ค๊ธฐ
์ ํ์
โ
๋น๊ตํ ๋ฌธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ,
lcs[i][j] = lcs[i-1][j-1] + 1
โ
๋น๊ตํ ๋ฌธ์๊ฐ ๊ฐ์ง ์์ ๊ฒฝ์ฐ,
lcs[i][j] = max( lcs[i-1][j], lcs[i][j-1] )
๐ฝ
4๏ธโฃ ๋ฉ๋ชจํ๊ธฐ(Memoization)
lcs 2์ฐจ์ ๋ฐฐ์ด์ ๋ฉ๋ชจ๋๊ณ ์๋ค.
๐ฝ
5๏ธโฃ ๊ธฐ์ ์ํ ํ์ ํ๊ธฐ
๊ธฐ์ ์ํ๋ ํ๊ณผ ์ด์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๋ฌธ์๋ฅผ ๋น๊ตํ๋ ๊ฒฝ์ฐ์ผ ๊ฒ์ด๋ค.
๊ธฐ์ ์ํ
lcs[0][j], lcs[i][0] = 0
๊ทธ๋ฐ๋ฐ ์ ํ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ i-1, j-1์ด ์ฌ์ฉ๋์ด์ผ ํ๋ฏ๋ก,
ํ๋ ฌ์์ 0์ผ๋ก ๊ตฌ์ฑ๋ ํ ํ๊ณผ ํ ์ด์ ์ถ๊ฐํด์ค๋ค.
(์๋ฌด ๋ฌธ์๋ ๋น๊ตํ์ง ์๋ ์ํ๋ฅผ ์๋ฏธํ๊ณ , ๊ณ์ฐ์ ์ํด ์ถ๊ฐํ๋ค ์๊ฐํ๋ฉด ํธํ๋ค.)
๐ฝ
6๏ธโฃ ๊ตฌํํ๊ธฐ
1) Bottom-Up - ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ โ
์ฐธ๊ณ ๋ก, 0์ผ๋ก ๊ตฌ์ฑ๋ ํ ํ๊ณผ ํ ์ด ๋๋ฌธ์ ํ๋ ฌ์์์ ๋ฌธ์ ์์น๊ฐ ํ๋์ฉ ๋ค๋ก ๋ฐ๋ ธ์ผ๋ฏ๋ก(+1),
๋ฌธ์์ด์์์ ๋น๊ต๋ 1์ ๋นผ์ค s1[i-1]๊ณผ s[j-1]์ ๋น๊ตํ๋ค.
'๐ง๐ปโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Greedy] 2212 ์ผ์(Python) (0) | 2023.02.20 |
---|---|
๋ฐฑ์ค 1966๋ฒ ํ๋ฆฐํฐํ [์๋ฎฌ๋ ์ด์ ][Python] (1) | 2023.01.17 |
๋ฐฑ์ค 1912๋ฒ ๋์ ํฉ [DP][Python] (0) | 2023.01.14 |
๋ฐฑ์ค 15624๋ฒ ํผ๋ณด๋์น ์ 7 [Python / JavaScript] (0) | 2023.01.09 |
- Total
- Today
- Yesterday
- git
- ํจ์
- ํ์ด์ฌ
- ๊ทธ๋ํ
- ๋ธ๋ผ์ฐ์
- Browser
- DB
- Component
- CSS
- react
- Python
- ๋ฆฌ์กํธ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- mdn
- ์๋ฐ์คํฌ๋ฆฝํธ
- useState
- BOJ
- github
- error
- JavaScript
- ์ ๋ ฌ
- ์๊ณ ๋ฆฌ์ฆ
- ์๋ฌ
- Context API
- ์๋ฃ๊ตฌ์กฐ
- DOM
- zustand
- state
- leetcode
- React Query
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |