1. ๊ฐ๋ ๐ข
์ต์ฅ๊ณตํต๋ถ๋ถ์์ด(Longest Common Subsequence)์ด๋ ์ฃผ์ด์ง ์์ด์ ๋ถ๋ถ ์์ด์์ ๊ฐ์ฅ ๊ธด ๊ฒ์ ์๋ฏธํ๋ค. ์์ ๊ทธ๋ฆผ์์ ์ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ถ๋ถ ์์ด์ด ์ฐ์์ ์ผ ํ์๋ ์๋ค.
2. ๋์๋ฐฉ์ ๐ฆ
๋์ ๋ฐฉ์์ DP๋ฅผ ์ด์ฉํ๋ค. ๋ฌธ์์ด A์ ๋ฌธ์์ด B๊ฐ ์ฃผ์ด์ก๋ค๊ณ ํ์.
- ๋ฌธ์์ด A์ ๋ฌธ์์ด B๋ฅผ ํ ๊ธ์์ฉ ๋น๊ตํ๋ค.
- ๋น๊ตํ๋ ๋ฌธ์๊ฐ ๊ฐ๋ค๋ฉด DP[i][j] = DP[i - 1][j - 1] + 1์ด ๋๋ค.
๋น๊ตํ๋ ๋ฌธ์๊ฐ ๋ค๋ฅด๋ค๋ฉด DP[i][j]๋ DP[i-1][j]์ DP[i][j-1] ์ค์ ํฐ ๊ฐ์ผ๋ก ์ค์ ํ๋ค. - 1๋ฒ๊ณผ 2๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ฌ๊ธฐ์ ๋งํ๋ DP[i][j]๋ ๋ฌธ์์ด A๋ i๋ฒ์งธ๊น์ง ๋ฌธ์์ด B๋ j๋ฒ์งธ๊น์ง ๊ณ ๋ คํ์์ ๊ฒฝ์ฐ์ ์ป์ ์ ์๋ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ ๊ธธ์ด์ด๋ค. i์ j๋ 1๋ถํฐ ๋ฌธ์์ด์ ๊ธธ์ด๊น์ง ์ํํ๊ณ i ๋๋ j๊ฐ 0์ธ ์ฅ์์ DP ๊ฐ์ 0์ผ๋ก ์ค์ ํ๋ค.
- ๋น๊ตํ๋ ๋ฌธ์๊ฐ ๊ฐ์ ๋ 'DP[i][j] = DP[i - 1][j - 1] + 1'์ธ ์ด์
์ด์ ์ํฉ๊น์ง์ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ ํ์ฌ ๋น๊ต๋ ๊ฐ์ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๋ ๊ณผ์ ์ด๋ค. - ๋น๊ตํ๋ ๋ฌธ์๊ฐ ๊ฐ์ ๋ 'DP[i][j] = max(DP[i-1][j], DP[i][j-1])'์ธ ์ด์
ํด๋น ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ํด์๋ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์์์ ๋ถ๋ถ์์ด์ ์ฐ์์ ์ผ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋ค์ ์ธ์งํด์ผ ํ๋ค. ์ฐ์์ ์ผ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋น๋ก ์ง๊ธ ๋น๊ตํ๋ ๋ฌธ์๊ฐ ๋ค๋ฅด๋๋ผ๋ ์ด์ ๊น์ง์ ์ํฉ์์ ์ป์ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ ๊ณ์ํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ์ด์ ๊น์ง์ ์ํฉ์ DP[i-1][j]์ DP[i][j-1]์ ์๋ฏธํ๋ค. (์ต์ฅ๊ณตํต๋ฌธ์์ด์ ๋์๋ฐฉ์๊ณผ ๋น๊ตํด ๋ณธ๋ค๋ฉด ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.)
'ABCDEF'์ 'GBCDFE'๋ฅผ ์ด์ฉํ์ฌ LCS๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๊ทธ๋ฆผ์ ์ด์ฉํ์ฌ ์ดํดํ์ฌ ๋ณด์.
์์ ๊ณผ์ ์ ํตํด 'ABCDEF'์ 'GBCDFE'์ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ 'BCDF', 'BCDE'๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
์์ ๊ณผ์ ์ ํ์ฉํ๋ค๋ฉด ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ ๊ธธ์ด๋ฟ๋ง ์๋๋ผ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ธ 'BCDF'์ 'BCDE'๋ฅผ ์ ์ ์๋ค. ๊ทธ ๊ณผ์ ์ ์์ ๋์๋ฐฉ์์ ์ญ์์ผ๋ก ํด์ฃผ๋ฉด ๋๋ค. ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ ์ ์ฅํ ๋ฐฐ์ด์ LCS๋ผ๊ณ ํ์.
- DP์ ๋ง์ง๋ง ๊ฐ๋ถํฐ ์์ํ๋ค.
- DP[i-1][j]์ DP[i][j-1] ์ค ํ์ฌ ๊ฐ๊ณผ ๊ฐ์ ๊ฒ์ ์ฐพ๋๋ค.
- ๊ฐ์ ๊ฐ์ด ์๋ค๋ฉด ํด๋น ๊ฐ์ผ๋ก ์ด๋ํ๋ค.
๊ฐ์ ๊ฐ์ด ์๋ค๋ฉด LCS์ ํด๋น ๋ฌธ์๋ฅผ ๋ฃ๊ณ DP[i-1][j-1]๋ก ์ด๋ํ๋ค. - 2๋ฒ๊ณผ 3๋ฒ ๊ณผ์ ์ 0์ ๋ง๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- DP[i-1][j]์ DP[i][j-1] ์ค ํ์ฌ ๊ฐ๊ณผ ๊ฐ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
์ด์ ์ํฉ๊ณผ ํ์ฌ ์ํฉ์ ๋น๊ตํ์์ ๋ ๊ฐ์ ๋ฌธ์๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ์ด๋ค. ๊ทธ๋์ LCS์ ๊ฐ์ ์ ์ฅํ์ง ์๋๋ค. - DP[i-1][j]์ DP[i][j-1] ์ค ํ์ฌ ๊ฐ๊ณผ ๊ฐ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
์ด์ ์ํฉ๊ณผ ํ์ฌ ์ํฉ์ ๋น๊ตํ์์ ๋ ๊ฐ์ ๋ฌธ์๋ฅผ ์ฐพ์์ DP๊ฐ์ ๋ณํ๊ฐ ์์๋ ๊ฒฝ์ฐ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํด๋น ๊ฐ์ LCS์ ์ ์ฅํด์ฃผ์ด์ผ ํ๋ค.
์์ ๊ณผ์ ์ ๋ง์น๊ฒ ๋๋ค๋ฉด LCS์ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ด ๋ด๊ธฐ๊ฒ ๋๋ค.
3. ๊ตฌํ(JAVA) ๐
DP์ ๋ง์ง๋ง ๊ฐ์ด ์ฃผ์ด์ง ์์ด์ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ ๊ธธ์ด๋ฅผ ์ ์ฅํ๊ณ ์์ผ๋ฏ๋ก ์ต์ฅ๊ณตํต๋ฌธ์์ด์์ ์ฒ๋ผ ์ต๋๊ธธ์ด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์๋ค.
public static void main(String[] args) {
String A = "ABCDEF";
String B = "GBCDFE";
int aStrLen = A.length();
int bStrLen = B.length();
int[][] DP = new int[aStrLen + 1][bStrLen + 1];
for(int i = 1; i <= aStrLen; i++) {
for(int j = 1; j <= bStrLen; j++) {
// ๋น๊ตํ๋ ๋ฌธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
if(A.charAt(i - 1) == B.charAt(j - 1)) {
DP[i][j] = DP[i - 1][j - 1] + 1;
}
// ๋น๊ตํ๋ ๋ฌธ์๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ
else {
DP[i][j] = Math.max(DP[i - 1][j], DP[i][j - 1]);
}
}
}
System.out.println(DP[aStrLen][bStrLen]);
}
ํด๋น ๊ธ์ emplam27 ๋์ '๊ทธ๋ฆผ์ผ๋ก ์์๋ณด๋ LCS ์๊ณ ๋ฆฌ์ฆ'์ ์ฐธ๊ณ ํ์์ต๋๋ค.
'๐ ์๊ณ ๋ฆฌ์ฆ > ETC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ต์ฅ๊ณตํต๋ฌธ์์ด(Longest Common Substring - LCS) (0) | 2023.04.01 |
---|---|
์ต์ฅ์ฆ๊ฐ๋ถ๋ถ์์ด(Longest Increasing Subsequence - LIS) (0) | 2023.04.01 |
์๋ก์ ์งํฉ(Disjoint-sets) (0) | 2023.03.01 |