์ฝํ ๋ณด๋ค๊ฐ ๋์จ ๊ฒ์ด๊ธฐ์ ์ ๋ฆฌํ๋ค...
LCS (Longest Common Subsequence)๋ ์ฃผ์ด์ง ์ฌ๋ฌ ๊ฐ์ ์์ด ์ค์์ ๋ชจ๋์ ๋ถ๋ถ์์ด์ด ๋๋ ์์ด๋ค ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๊ฒ์ด๋ค.
์์๋ฅผ ๋ณด์๋ฉด,
ACAYKP์ ๋ถ๋ถ์์ด์
{A}, {C}, {A}, {Y}, {K}, {P}, {A, C}, {A, A}, {A, Y}, ... {A, C, A, Y, K, P} ์ด๊ณ ,
CAPCAK์ ๋ถ๋ถ์์ด์
{C}, {A}, {P}, {C}, {A}, {K}, {C, A}, {C, P}, {C, C}, ... {C, A, P, C, A, K}์ด ์๋๋ฐ
๊ฐ๊ฐ์ ๋ถ๋ถ์์ด ์ค์์ ์๋ก ๊ฐ์ ๋ถ๋ถ์์ด์ด ์์ ๊ฒ์ด๋ค.
๊ทธ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ์ผ๋ฉด ๋๋๋ฐ ์์ ์์์ ๋ต์ ๊ธธ์ด๊ฐ 4์ธ {A, C, A, K} ์ด๋ค.
๋ํ์ ์ธ ๋ฌธ์ ๋ ์๋์ ๊ฐ๋ค.
https://www.acmicpc.net/problem/9251
9251๋ฒ: LCS
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
www.acmicpc.net
๐น๏ธ LCS (์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด) ์๊ณ ๋ฆฌ์ฆ ๊ณผ์
๋ฐฑํธ๋ํน์ ์ฌ์ฉํด์ ์์ ํ์์ ํด๋ ๋์ง๋ง, ์ฃผ์ด์ง ์์ด์ด ๊ธธ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์
DP(๋์ ๊ณํ๋ฒ)๋ก ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ์ฌ Top-Down ๋๋ Bottom-Up์ผ๋ก ๊ตฌํํ๋ฉด ๋๋ค !
๋ถ๋ถ์์ด ๊ฐ์ ๊ฒฝ์ฐ ์์๊ฐ ์ง์ผ์ง๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ฌธ์์ด๋ค์ ๋ฌธ์๋ค์ ๋น๊ตํ๋ฉฐ ์๋ก ๊ฐ์ผ๋ฉด 1์ฉ ์ฆ๊ฐ์์ผ ๋์ ํฉ์ ๊ตฌํ๋ฉด ๋๋ค.
๋ฐฑ์ค ๋ฌธ์ ์ ์์๋ฅผ ํ์ธํด๋ณด์ !
๐น ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ ๊ธธ์ด
s1 = ACAYKP
s2 = CAPCAK ๋ผ๊ณ ํ์ ๋, s1์ ๊ธฐ์ค์ผ๋ก s2์ ๋น๊ตํ ๊ฒฐ๊ณผ๋ฅผ ํ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
s1์ 'A'์ s2์ ๋ฌธ์์ด ํ๋ํ๋ ์ฆ๊ฐ์ํค๋ฉฐ ๋น๊ตํ ๊ฒ์ด๋ค.
[C, A]๋ s1์ 'A' ์ s2์ 'C'๋ฅผ ๋น๊ตํ ๊ฒ์ด๊ณ , [A, A]๋ s1์ 'A'์ s2์ 'CA'๋ฅผ ๋น๊ตํ์ฌ ๊ณตํต์ธ ์์ด์ด 'A' ํ๋์ด๊ธฐ ๋๋ฌธ์ 1์ ์ ์ด์ฃผ์๋ค.
[K, A]๋ s1์ 'A'์ s2์ 'CAPCAK'๋ฅผ ๋น๊ตํ์ฌ ๊ณตํต์ธ ์์ด์ด ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก 'A' ํ๋์ด๊ธฐ์ 1์ด ๋ ๊ฒ์ด๋ค.
ํ๋ฅผ ๋ค ์ฑ์๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
์ฌ๊ธฐ์๋ ํ๋ ์๋ฅผ ๋ค์ด๋ณด๋ฉด, 5๋ฒ์งธ ์ด๊ณผ 5๋ฒ์งธ ํ์ ์์นํ๋ [A, K] ๊ฐ์ ๊ฒฝ์ฐ s1์ 'ACAYK'์ s2์ 'CAPCA'๋ฅผ ๋น๊ตํ๋ค.
๊ณตํต์ธ ์์ด์ด 'ACA'์ด๊ธฐ ๋๋ฌธ์ 3์ ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค.
ํ๋ฅผ ์ฑ์ฐ๋ค ๋ณด๋ฉด ๊ท์น์ ์ฐพ์ ์ ์๋ค !
์ธ๋ก๋ฐฉํฅ ์ฆ, ์ด์ ์ฑ์ฐ๋ค๋ณด๋ฉด ๊ฐ์ ์์๊ฐ ์กด์ฌํ๋ฉด ์ด์ ์ด (๋๋ ํ)์ +1ํ ๊ฐ์ด LCS ๊ธธ์ด๊ฐ ๋๋ค.
(0, 1)์ 'AC'์ 'C'๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ ๊ฐ์ธ 1์ด๋ค.
(1, 2)๋ 'ACA'์ 'CA'๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ ๊ฐ์ธ 2์ด๋ค.
โก๏ธ {C}, {A, C}์์ 'A'๋ผ๋ ๊ณตํต ์์๊ฐ ์ถ๊ฐ๋๋ฉด์ +1์ด ๋์ด 2์ ๊ฐ์ ์ป๊ฒ ๋์๋ค.
๐ ์ฆ, x๋ฒ์งธ ์์์ y๋ฒ์งธ ์์๊ฐ ๊ฐ๋ค๋ฉด (x-1, y-1)์ ์๋(๋๊ฐ์ ์ ์กด์ฌํ๋) ๊ฐ +1์ ํด์ฃผ๋ฉด ๋๋ค !
๊ฐ์ง ์๋ค๋ฉด ์ด์ ํ ๋๋ ์ด์ ์์ ์ค ํฐ ๊ฐ์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค .!
โจ 24.03.11 ๋ด์ฉ ์ถ๊ฐ !!
๐น ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด ์ถ๋ ฅํ๊ธฐ
์์ ๋ณธ ๋ด์ฉ์ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ ์ ์์ง๋ง ๊ทธ๋ฌํ ๋ถ๋ถ ์์ด์ด ์ด๋ค ๊ฒ์ธ์ง๋ ํ๋ก ํ ๋์ ์์๋ณด๊ธฐ ํ๋ค๋ค.
์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ ํด๋นํ๋ ๋ถ๋ถ ์์ด์ ์ถ๋ ฅํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
๐ ์์์ ๊ตฌํ ํ๋ฅผ ์ด์ฉํ์ฌ ์ญ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ฉด์ LCS์ ๊ธ์๋ฅผ ์ญ์์ผ๋ก ์ฐพ์ผ๋ฉด ๋๋ค.
๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฒซ๋ฒ์งธ ํ, ์ด๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ค.
- X์ Y ํ์ฌ์ ๊ธ์๊ฐ ๊ฐ์ผ๋ฉด (๋ ธ๋์ ๋๊ทธ๋ผ๋ฏธ) LCS์ ํฌํจ์ํค๊ณ ์์ชฝ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ค.
- ๊ฐ์ง ์์ผ๋ฉด ์์ชฝ ๋๋ ์ผ์ชฝ ์นธ์ ๊ฐ ์ค ํฐ ๊ฐ์ ๋ฐ๋ผ ์ด๋ํ๋ค.
์ฝ๋๋ก ๊ฐ๋จํ๊ฒ ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
while(i>0 && j>0){
if(X[i-1]==Y[i-1]){
LCS[LCSLength] = X[i-1];
// ์์ชฝ ์ผ์ชฝ์ผ๋ก ํฅํ๋ ๋๊ฐ์ ์ผ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ.
i--;
j--;
LCSLength--;
}
else if(LCSTable[i-1][j] > LCSTable[i][j-1] i--;
else j--;
}
๐ฉ๐ป LCS ๊ตฌํ ์ฝ๋
public class Main{
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str1 = br.readLine();
int len1 = str1.length();
String str2 = br.readLine();
int len2 = str2.length();
int[][] dp = new int[len1+1][len2+1];
for(int i = 1; i <= len1; i++) {
char C = str1.charAt(i-1);
for(int j = 1; j <= len2; j++) {
// (i-1)๊ณผ (j-1) ๋ฒ์งธ ๋ฌธ์๊ฐ ์๋ก ๊ฐ๋ค๋ฉด
if(C == str2.charAt(j-1)) {
// ๋๊ฐ์ ์ (i-1, j-1)์ dp์ +1 ํ ๊ฐ์ผ๋ก ๊ฐฑ์
dp[i][j] = dp[i-1][j-1] + 1;
}
else {
// ๊ฐ์ง ์๋ค๋ฉด ์ด์ ์ด(i-1)๊ณผ ์ด์ ํ(j-1)์ ๊ฐ ์ค ํฐ ๊ฒ์ผ๋ก ๊ฐฑ์
dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]);
}
}
}
System.out.println(dp[len1][len2]);
}
}
์ฐธ๊ณ
'์๊ณ ๋ฆฌ์ฆ > ๐๏ธ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐บ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ ์๊ณ ๋ฆฌ์ฆ ๐บ (0) | 2024.04.09 |
---|---|
๐ ๋ฌํฝ์ด ์ด๋ ํจ์จ์ ์ธ ์ฝ๋ ๐ (0) | 2024.03.30 |
Topological Sort (์์์ ๋ ฌ) (1) | 2024.02.27 |
Simulation - 2์ฐจ์ ๋ฌํฝ์ด ๋ฐฐ์ด ๐ (0) | 2024.02.08 |
DP - Knapsack (๋ฐฐ๋ญ๋ฌธ์ ) (1) | 2024.02.05 |