다이나믹 프로그래밍 적용 문제 (4) 최장 공통 부분순서 LCS
문제 설명
부분순서와 공통 부분순서의 예시는 다음과 같다.
<BCDB>는 문자열 <ABCBDAB>의 부분순서.
<BCA>는 문자열 <ABCDBAB>와 <BDCABA>의 공통 부분순서.
최장 공통 부분순서(Longest Common Subsequence)란 공통 부분순서들 중 가장 긴 것을 말한다.
예를 들어, 다음 두 문자열의 LCS를 구하면 다음과 같다.
h e r o i c a l l y
s c h o l a r l y
결과 문자열 : holly, LCS : 5
주어지는 두 문자열의 LCS를 구하라.
점화식
LCS(i, j) : 문자열 X[i] = "x1,x2, … ,xi" 과 Y[j] = "y1,y2, … ,yj" 의 LCS 길이
LCS(i, j) = {
0 ( if i = 0 or j = 0 )
LCS(i-1, j-1) + 1 ( if i, j > 0 and x[i] = y[j] )
max{ LCS(i-1, j), LCS(i, j-1) } ( if i, j > 0 and x[i] ≠ y[j] )
}
LCS : 재귀적 알고리즘 (효율적 측면에서 부적합)
LCS(i, j) {
if (i = 0 or j = 0) then
return 0;
else if (x[i]= y[j]) then
return LCS(i-1, j-1) + 1;
else
return max( LCS(i-1, j), LCS(i, j-1) );
}
print ( LCS(m, n) );
LCS : 다이나믹 프로그래밍
for i ← 0 to m
C[i, 0] ← 0;
for j ← 0 to n
C[0, j] ← 0;
for i ← 1 to m {
for j ← 1 to n
if (x[i]= y[j]) then C[i, j] ← C[i-1, j-1] + 1;
else C[i, j] ← max(C[i-1, j], C[i, j-1]);
}
print (C[m, n]);
문제 예시1
주어진 문자열
X = "AABACA"
Y = "ABCAB"
| ∮ | A | B | C | A | B | |
| ∮ | 0 | 0 | 0 | 0 | 0 | 0 |
| A | 0 | 1 | 1 | 1 | 1 | 1 |
| A | 0 | 1 | 1 | 1 | 2 | 2 |
| B | 0 | 1 | 2 | 2 | 2 | 3 |
| A | 0 | 1 | 2 | 2 | 3 | 3 |
| C | 0 | 1 | 2 | 3 | 3 | 3 |
| A | 0 | 1 | 2 | 3 | 4 | 4 |
LCS = 4
문제 예시2
주어진 문자열
X = "ADFGT"
Y = "AFOXT"
| ∮ | A | F | O | X | T | |
| ∮ | 0 | 0 | 0 | 0 | 0 | 0 |
| A | 0 | 1 | 1 | 1 | 1 | 1 |
| D | 0 | 1 | 1 | 1 | 1 | 1 |
| F | 0 | 1 | 2 | 2 | 2 | 2 |
| G | 0 | 1 | 2 | 2 | 2 | 2 |
| T | 0 | 1 | 2 | 2 | 2 | 3 |
LCS = 3
문제 예시3
주어진 문자열
X = "SPRINGTIME"
Y = "PIONEER"
| ∮ | P | I | O | N | E | E | R | |
| ∮ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| S | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| P | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| R | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 2 |
| I | 0 | 1 | 2 | 2 | 2 | 2 | 2 | 2 |
| N | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 |
| G | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 |
| T | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 |
| I | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 |
| M | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 |
| E | 0 | 1 | 2 | 2 | 3 | 4 | 4 | 4 |
LCS = 4
문제 예시4
주어진 문자열
X = "XYZABCB"
Y = "ABCXYZAY"
| ∮ | A | B | C | X | Y | Z | A | Y | |
| ∮ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| X | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
| Y | 0 | 0 | 0 | 0 | 1 | 2 | 2 | 2 | 2 |
| Z | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 3 | 3 |
| A | 0 | 1 | 1 | 1 | 1 | 2 | 3 | 4 | 4 |
| B | 0 | 1 | 2 | 2 | 2 | 2 | 3 | 4 | 4 |
| C | 0 | 1 | 2 | 3 | 3 | 3 | 3 | 4 | 4 |
| B | 0 | 1 | 2 | 3 | 3 | 3 | 3 | 4 | 4 |
LCS = 4
'컴퓨터공학 💻 > 알고리즘 분석' 카테고리의 다른 글
| [알고리즘] 알고리즘의 점근적 분석 : 상한, 하한, 동등 (0) | 2021.09.19 |
|---|---|
| [알고리즘] 알고리즘 시간 복잡도 분석과 수행시간을 좌우하는 기준 (0) | 2021.09.06 |
| [알고리즘] 다이나믹 프로그래밍 적용 문제 (3) 행렬 곱셈 순서 (0) | 2021.09.04 |
| [알고리즘] 다이나믹 프로그래밍 적용 문제 (2) 조약돌 놓기 (0) | 2021.09.04 |
| [알고리즘] 다이나믹 프로그래밍 적용 문제 (1) 행렬 경로 (0) | 2021.09.03 |