[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(LCS)
Logest Common Subequence
์ฐ๋ฆฌ ๋ง๋ก ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด๋ค ๋ฌธ์์ด์ด ๋ ๊ฐ ์์ ๋, ๋ ์์ด ์ฌ์ด์ ์๋ ๊ณตํต์ ์ธ ๋ฌธ์๋ค์ ๊ฐ์ฅ ๊ธด ์กฐํฉ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋ ๋ฌธ์์ด์ด ์๋ค๊ณ ํ์.
Y = (B, D, C, A, B, A)
๋ ๋ฌธ์์ด์ ์ฌ์ด์๋ ๋ง์ ๋ถ๋ถ ๋ฌธ์์ด๋ค์ด ์๋๋ฐ, ๋ฌธ์๊ฐ ํ๋ ๋ฟ์ธ ๋ถ๋ถ ๋ฌธ์์ด์ ์ ์ธํ๊ณ ๋ชจ๋ ๋์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค:
A, B, A
B, C
B, C, B
C, B
C, B, A
B, D
B, D, A
B, D, A, B
์ด ์ค์์ ๊ฐ์ฅ๊ธด ๋ถ๋ถ ๋ฌธ์์ด์ B,D,A,B๊ฐ ๋ ๊ฒ์ด๋ค.
Brute-Force
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋จผ์ ๋ธ๋ฃจํธ ํฌ์ค๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฐ์ ธ๋ณด๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์. ์ฐ๋ฆฌ์๊ฒ ๋ ๊ฐ์ ๋ฌธ์์ด X[1...m] ๊ณผ Y[1...n] ๊ฐ ์๋ค๊ณ ํด๋ณด์. ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ค ์๋ํด๋ณด๋ ค๋ฉด, X์ ์๋ ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ตฌํด์ Y์ ๋์ ํด๋ณด๋ฉด ๋๋ค. ๋ฐ๋ผ์ ๋ธ๋ฃจํธ ํฌ์ค๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๋๋,
- m ๊ฐ์ ๋ฌธ์๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์์ด X์์ ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์์ด์ ๋ง๋ค ๋ ๊ฑธ๋ฆฌ๋ ์๋ 2m.
- ์์์ ๊ตฌํ ๋ถ๋ถ์์ด์ Y์ ๋์ ํด๋ณผ ๋ ์์๋๋ ์๋ O(n).
๋ ์ฐ์ฐ ์๊ฐ์ ํฉ์ด ๋๊ณ ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ ๋, O(n2m) ์ผ๋ก ํํํ ์ ์๋ค. ๋ฐ๋ผ์ m์ ๊ฐฏ์์ ๋ฐ๋ผ ์์ฒญ๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ฃจํธ ํฌ์ค๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ์ ํฉํ ์ ๊ทผ์ด ์๋๋ค.
Dynamic Programming
Step 1 : Optimal Substructure
๋ฌธ์ ๋ฅผ ์ผ๋ฐํํ๊ธฐ ์ํด์ ๋น๊ตํด์ผํ๋ ๋ฌธ์์ด์ X=<x1, x2, ... , xm>, Y=<y1, y2, ... , yn> ๋ผ๊ณ ํ๊ณ , ๋ ๋ฌธ์์ด์ LCS๋ฅผ Z=<z1, z2, ... , zk> ๋ผ๊ณ ํด๋ณด์. ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ์ ๊ฐ ์ฑ๋ฆฝํ๋ค๊ณ ํ ์ ์์ ๊ฒ์ด๋ค.
- xm = yn ์ด๋ผ๋ฉด, xm = yn = zk ์ด๊ณ ์๋ก์ด LCS ๋ Xm-1 ์ Yn-1 ์ด๋ผ๊ณ ํ ์ ์๋ค.
- ์์์ด ํท๊ฐ๋ฆด ์๋ ์๋๋ฐ, ๋งค์ฐ ๋น์ฐํ ์ด์ผ๊ธฐ๋ฅผ ์ํ์ ์ผ๋ก ํํํ ๊ฒ์ด๋ค. ๋ ๋ฌธ์์ด์ ๊ฐ์ฅ ๋ ๋ฌธ์๊ฐ ์๋ก ๊ฐ๋ค๋ฉด, LCS์ ๊ฐ์ฅ ๋์ด ํด๋น ๋ฌธ์๋ก ๋๋๋ ๊ฒ์ ๋๋ฌด๋ ์๋ช ํ์ง ์์๊ฐ?
- xm ≠ yn ์ด๋ผ๋ฉด, xm ≠ zk ์ด๊ณ ์๋ก์ด LCS ๋ Xm-1 ์ Y ์ด๋ผ๊ณ ํ ์ ์๋ค.
- xm ≠ yn ์ด๋ผ๋ฉด, yn ≠ zk ์ด๊ณ ์๋ก์ด LCS ๋ X ์ Yn-1 ์ด๋ผ๊ณ ํ ์ ์๋ค.
- ๋ง์ฝ ๋ ๋ฌธ์๊ฐ ๋ค๋ฅด๋ค๊ณ ํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ ์ ์๋ค. X ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์ค์ด๊ฑฐ๋, Y ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์ค์ด๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ๊ตฌํ๊ณ ์ ํ๋ ๊ฒ์ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ๋ฌธ์์ด์ ๊ตฌ์ฑํ๊ฒ๋๋ ์กฐํฉ์ด๊ธฐ ๋๋ฌธ์ ๋ ๊ฒฝ์ฐ ์ค์์ ๋ ํฐ ๋ถ๋ถ ๋ฌธ์์ด์ ๋ง๋๋ ์ชฝ์ ์ ํํด์ผ ํ ๊ฒ์ด๋ค.
Step 2 : Recursive Solution
์ ๋ ผ๋ฆฌ๊ฐ ๊ฝค๋ ํ๋นํ๊ณ ์๊ฐ์ด ๋ ๋ค. ๊ทธ๋ ๋ค๋ฉด ์์์ผ๋ก ๋ง๋ค์ด๋ณด์.
c[i, j] ๊ฐ i, j ์ฌ์ด์ ์ต๋ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๋ค๋ฉด, X ์ Y ์ ๋ฌธ์๊ฐ ๊ฐ์ ๋, ๋ฐ๋ก ์ด์ ์ต์ฅ ๋ฌธ์์ด์ ๊ธธ์ด์ 1์ ๋ํ ๊ฐ์ ์๋ก ์ ์ฅํ๊ณ , ๋ ๋ฌธ์๊ฐ ๋ค๋ฅผ ๋๋ X์ชฝ ์ต์ฅ ๋ฌธ์์ด์ ๊ธธ์ด์ Y์ชฝ ์ต์ฅ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋น๊ตํด์ ๋ ํฐ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
๊ทธ๋ฐ๋ฐ ์ ๊ณ์ฐ์ ๋๋ก ์งํํ๋ฉด, ์ฐ๋ฆฌ๋ ๊ฒฐ๊ตญ ๋๊ฐ์ ์ฐ์ฐ์ ๊ณ์ํด์ ํด์ผํ๋ ์ํฉ์ ๋ง์ดํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ์ํฉ์ ์ฐ์ฐ ์๊ฐ์ ๋ญ๋นํ๊ฒ ํ๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํ๋ฒ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ํ ์ด๋ธ์ ์ ์ฅํด๋๊ณ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์์ ์๋ํด์ผํ๋ค.
Step 3 : Computing the Optimal Costs
์ด๋ฏธ ๊ณ์ฐํ ๊ฐ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด์ 2์ฐจ์ ๋ฐฐ์ด์ ํตํด ํ ์ด๋ธ์ ๋ง๋ค์ด ์ด ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
Y\X | 0 | A | B | C | B | D | A | B |
---|---|---|---|---|---|---|---|---|
0 | ||||||||
B | ||||||||
D | ||||||||
C | ||||||||
A | ||||||||
B | ||||||||
A |
์์ ๊ฐ์ด ํ ์ด๋ธ์ ์ธํ ํ์. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ X์ ๋ฌธ์์ ๋ํด์ Y์ ๋ฌธ์๋ฅผ ๊บผ๋ด์ ๋น๊ตํด์ ์์์ ์์ฑํ๋ ์์์ ๋ฐ๋ผ ๊ฐ์ ์ฑ์ ๋ฃ์. ์ฒซ ๋ช ๊ฐ๋ฅผ ์งํํด๋ณด๋ฉด,
Y\X | 0 | A | B | C | B | D | A | B |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
D | 0 | |||||||
C | 0 | |||||||
A | 0 | |||||||
B | 0 | |||||||
A | 0 |
B์ ๋ํ ํ์ ๋ค์๊ณผ ๊ฐ์ด ์ฑ์ธ ์ ์๋ค. A๋ฅผ ๋ง๋ฌ์ ๋๋ ์ด์ ๊ฐ ์ค์ ์ ์ผ ํฐ 0์ ๋ฃ์ด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ B๋ฅผ ๋ง๋๊ฒ ๋๋ฉด Xi ์ Yj ์ ๊ฐ์ด ๊ฐ๊ธฐ ๋๋ฌธ์ ์ด์ ์์น์ ๊ฐ์ฅ ๊ธด ๊ธธ์ด์ธ 0์ 1์ ๋ํด 1๋ก ์ฑ์์ฃผ๊ณ ์๋ค. C๋ฅผ ์ฒดํฌํด๋ณด๋ฉด B์ C๋ ๋ค๋ฅธ ๊ฐ์ด๊ธฐ ๋๋ฌธ์, X๋ฅผ ์ ์ธ ํ์ ๋, ์ฆ ๋ฐ๋ก ์ผ์ชฝ์ ์๋ ๊ฐ๊ณผ, Y๋ฅผ ์ ์ธํ์ ๋, ์ฆ ์ข์ธก ๋๊ฐ์ ์์ ์๋ ๊ฐ ์ค์ ๋ ํฐ ๊ฐ์ผ๋ก ๋ฐฐ์ด์ ์ฑ์์ฃผ๊ฒ ๋๋ค. ์ด ๋ ผ๋ฆฌ๋๋ก ํ ์ด๋ธ์ ๋ชจ๋ ์ฑ์๋๊ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฅผ ์์ฑ์ํฌ ์ ์๋ค.
Y\X | 0 | A | B | C | B | D | A | B |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
D | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 |
C | 0 | 0 | 1 | 2 | 2 | 2 | 2 | 2 |
A | 0 | 1 | 1 | 2 | 2 | 2 | 3 | 3 |
B | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 4 |
A | 0 | 1 | 2 | 2 | 3 | 3 | 4 | 4 |
์ ํ์์ ํ์ธํ ์ ์๋ ๊ฒ ์ฒ๋ผ ์ฐ๋ฆฌ๊ฐ ์ป์ ์ ์๋ LCS์ ๊ธธ์ด๋ 4์ด๊ณ , ํด๋น ๊ธธ์ด๋ก ์กฐํฉํ ์ ์๋ ๋ถ๋ถ ๋ฌธ์์ด์ ์ด 3์ข ๋ฅ๊ฐ ๋๋ค. ์๋ํ๋ฉด LCS๋ ์ฌ๋ฌ๊ฐ๊ฐ ๋์ฌ ์ ์๊ณ ํ์์ ์ต๋ ๊ฐ์ ๊ฐ์ง๋ ์์ดํ ์ ๊ฐฏ์๊ฐ ๊ทธ ๊ฒฝ์ฐ์ ์๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ณ์ฐ์ ์งํํ๊ฒ ๋๋ฉด, ์ฐ๋ฆฌ๋ LCS๋ฅผ ๋จ์ํ ํ์ ๋ชจ๋ ์์น๋ฅผ ์ํํ๋ ๊ฒ์ ํตํด ์ ์ ์๊ธฐ ๋๋ฌธ์, ์ฐ์ฐ ์๋๋ ๐ฉ(mn) ์ผ๋ก ํํํ ์ ์๋ค.
์ ํ๋ฅผ ๊ธฐ์ค์ผ๋ก LCS์ธ ์๋ธ์คํธ๋ง์ ์ป์ผ๋ ค๋ฉด LCS ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ์์ดํ ์์น๋ถํฐ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ฉด์, X์ Y๊ฐ ๊ฐ์ ์ํ๋ฒณ๋ค์ ๊ธฐ๋กํด์ฃผ๋ฉด ๋๋ค. ์ฌ๋ฌ ๋ฌธ์์ด์ด ๋์ฌ ์ ์์ง๋ง ํ๋๋ฅผ ์๋ก ๋ค์ด๋ณด๋ฉด, B -> A -> D -> B ์ ์ญ์์ผ๋ก ๋์ดํ ๋ฌธ์์ด์ธ BDAB ๊ฐ ํ๋์ LCS๊ฐ ๋ ๊ฒ์ด๋ค.
Step 4: Constructing an Optimal Solution
์ด์ ์ฝ๋๋ก ๊ตฌํํด๋ณด์. LCS ๋ฌธ์ ๋ ๊ฝค๋ ์ ๋ช ํ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ [๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ] ์๊ณ ๋ฆฌ์ฆ์์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณผ ์ ์์๋ค.
๋ฌธ์ : https://www.acmicpc.net/problem/9251
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int dp[1001][1001];
int main()
{
string s1, s2;
cin >> s1 >> s2;
int lcs = 0;
for (int i = 1; i <= s2.size(); i++)
{
for (int j = 1; j <= s1.size(); j++)
{
dp[i][j] = dp[i - 1][j];
if (s2[i - 1] == s1[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
lcs = max(lcs, dp[i][j]);
}
else
{
if (dp[i - 1][j] > dp[i][j - 1])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = dp[i][j - 1];
}
}
}
cout << lcs;
return 0;
}
'๐ฎ ์จ-์์ค > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem) (7) | 2021.07.17 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํํ๋ง ์ฝ๋(Huffman Code Problem) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Alogorithm) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํ๋ ฌ ๊ณฑ์ ๋ฌธ์ (Matrix Chain Multiplication) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(LIS) (0) | 2021.07.17 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote