[Boj_9251] LCS
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/9251
9251๋ฒ: LCS
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
www.acmicpc.net
โธ ๋ฌธ์
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 1
- ๐ ๋ฌธ์ ์ ํ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๋ฌธ์์ด
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ ๋์ ๊ณํ๋ฒ(Dynamic Programing, DP )์ด๋ ?
- ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฌธ์ ๋ฅผ ์ผ์ปซ๋ ๋ง์ด๋ค.
- DP์์๋ ์์ ๋ถ๋ถ์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์ ๋ถํ ์ ๋ณต๊ณผ๋ ๋ค๋ฅด๋ค.
- ๋ถํ ์ ๋ณต์์๋ ๋์ผํ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐ๋์ง ์๋๋ค.
๐ธ Dynamic Programing ๋ฐฉ๋ฒ
- ๋ชจ๋ ์์ ๋ฌธ์ ๋ค์ ํ ๋ฒ๋ง ํ์ด์ผ ํ๋ค.
- ๋ฐ๋ผ์ ์ ๋ต์ ๊ตฌํ ์์ ๋ฌธ์ ๋ฅผ ๋ฉ๋ชจํด ๋๊ณ ,
- ๊ทธ๋ณด๋ค ํฐ ๋ฌธ์ ๋ฅผ ํ์ด๋๊ฐ ๋, ๋๊ฐ์ ์์ ๋ฌธ์ ๊ฐ ๋ํ๋๋ฉด ๋ฉ๋ชจํด ๋์๋ ์์ ๋ฌธ์ ์ ๊ฒฐ๊ด๊ฐ์ ์ด์ฉํ๋ค.
๐ธ Dynamic Programing ์กฐ๊ฑด
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal Substructure)
- ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฌ์ฉํด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ํน์ ๋ฌธ์ ์ ์ ๋ต์ ๋ฌธ์ ์ ํฌ๊ธฐ์ ์๊ด์์ด ๋์ผํ๋ค.
- ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (Overlapping Subproblem)
- ๋์ผํ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํด๊ฒฐํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- ํด๋น ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋์ง ์๋๋ค๋ฉด ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ๋ถ๋ถ ๋ฌธ์ ๊ฐ ์ค๋ณต๋์ง ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ค.
๐ Memoization?
- DP๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ํ ์ข ๋ฅ๋ก,
- ํ ๋ฒ ๊ตฌํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฉ๋ชจํด ๋๊ณ , ๊ฐ์ ์์ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋ชจํ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฒ
- ๊ฐ์ ๊ธฐ๋กํด ๋๋๋ค๋ ์ ์์ ์บ์ฑ(Caching)์ด๋ผ๊ณ ๋ ํ๋ค.
๐ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(Longest Common Subsequence, LCS)์ด๋ ?
- LCS๋ Longest Common Subsequence์ ์ฝ์๋ก ์ต์ฅ ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ๋งํ๋ค.
- Subsequence๋ ๋ถ๋ถ ์์ด์ด๋ผ๋ ๋ป์ผ๋ก ์ฐ์์ ์ด์ง ์์๋ ๋๋ ๋ฌธ์์ด์ด๋ค.
- ํ๋ง๋๋ก, ๋ ๋ฌธ์์ด์ ๋น๊ตํ ๋ ๊ณตํต์ ์ผ๋ก ๋ํ๋๋ ๋ถ๋ถ ์์๋ค ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ด๋ค.
- LCS๋ ์ต์ ํ๋ฅผ ํด์ผ ํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋์ ๊ณํ๋ฒ(DP)์ ์ฌ์ฉํด์ผ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ๊ตฌํ ์ ์๋ค.
๐ค ๋ฌธ์ ํ์ด
LCS ๋ฌธ์ ์ ๊ฒฝ์ฐ, ๋ถ๋ถ ์์ด์์ '์์'๊ฐ ์ง์ผ์ง๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ฌธ์์ด๋ค์ ๋ฌธ์๋ค์ ์๋ก ๋น๊ตํ๋ฉฐ
๋ฌธ์๊ฐ ์๋ก ๊ฐ์ ๋ ๊ฐ์ 1์ฉ ์ฆ๊ฐ์ํค๋ฉด์ ๋์ ํฉ์ ๊ตฌํ๋ค.
๋ฌธ์ ์ ์์๋๋ก ํ ์ด๋ธ์ ๋ง๋ค์ด ๊ท์น์ ์ฐพ์๋ณด์
- str1 = ACAYKP
- str2 = CAPCAK
A | C | A | Y | K | P | ||
C | |||||||
A | |||||||
P | |||||||
C | |||||||
A | |||||||
K |
str1์ ์ฒซ ๋ฒ์งธ ๋ฌธ์์ธ 'A'๋ฅผ ๊ธฐ์ค์ผ๋ก str2์ ๋ฌธ์๋ค์ ๋น๊ตํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
A | C | A | Y | K | P | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | |
C | 0 | 0 | |||||
A | 0 | 1 | |||||
P | 0 | 1 | |||||
C | 0 | 1 | |||||
A | 0 | 1 | |||||
K | 0 | 1 |
์ฌ๊ธฐ์ ์ ๊ณ ๋ฏผํด์ผ ํ๋ ๊ฒ์ด 'A'์ 'CAPCA'๋ฅผ ๋น๊ตํ ๋,
๋ ๋ฒ์งธ 'A'๊ฐ ์ค๋๋ผ๋ 1์ ๋ํ๋ ๊ฒ์ด ์๋๋ผ {C, A, P, C, A}์ {A}์ ์ต์ฅ ๋ถ๋ถ ์์ด์ {A} ํ๋๋ฟ์ด๋ฏ๋ก 1์ด ๋๋ค.
A | C | A | Y | K | P | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | |
C | 0 | 0 | 1 | ||||
A | 0 | 1 | 1 | ||||
P | 0 | 1 | 1 | ||||
C | 0 | 1 | 2 | ||||
A | 0 | 1 | 2 | ||||
K | 0 | 1 | 2 |
{C}์ {A, C}์ ๋ถ๋ถ ์์ด์ {C}์ด๊ณ ,
{C, A, P, C}์ {A, C}์ ๋ถ๋ถ ์์ด์ {A, C}๋ก +1์ด ์ฆ๊ฐํ๋ค.
์ด๋, {A, C}์ ์์๋ ๊ณ ๋ คํด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก {C, A}๋ ํด๋น ๋ถ๋ถ์ ์์ด์ด ๋ ์ ์๋ค.
์ด๋ฌํ ๊ท์น์ ํตํด, ํ๋ฅผ ๋ชจ๋ ์ฑ์ฐ๋ฉด ์๋์ ๊ฐ๋ค.
A | C | A | Y | K | P | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | |
C | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
P | 0 | 1 | 1 | 2 | 2 | 2 | 3 |
C | 0 | 1 | 2 | 2 | 2 | 2 | 3 |
A | 0 | 1 | 2 | 3 | 3 | 3 | 3 |
K | 0 | 1 | 2 | 3 | 3 | 4 | 4 |
ํ๋ฅผ ์ฑ์ฐ๋ค ๋ณด๋ฉด ๊ท์น์ ์ฐพ์ ์ ์๋ค.
๊ฐ ์ด์ ์ฑ์๋๊ฐ ๋, ์์ ๊ณผ ๊ฐ์ ๋ฌธ์๊ฐ ์๋ค๋ฉด +1, ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด์ ํ์ ์์ ๋๋ ์ด์ ์์ ์ค ํฐ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฑ์ฐ๋ฉด ๋๋ค.
๊ทธ๋ฐ๋ฐ, ๊ฐ์ ๋ฌธ์๊ฐ ์์ ๊ฒฝ์ฐ ์ด๋ค ์๋ฅผ +1ํด์ผ ํ ๊น
์๋ ์์๋ฅผ ๋ค์ด๋ณด์
(0, 1)์ ๋ณธ๋ค๋ฉด {C}์ {A, C}์ ๊ณตํต๋ถ๋ชจ์ธ 'C'๋ฅผ ์๋ฏธํ๋ฉฐ 1์ ๊ฐ์ด ๋ค์ด์จ๋ค.
(1, 2)๋ฅผ ๋ณธ๋ค๋ฉด {C, A}์ {A, C, A}์ ๊ณตํต ์์ด์ธ {C, A}๊ฐ ๋์ด 2์ ๊ฐ์ด ๋ค์ด์จ๋ค.
์ฆ, {C}์ {A, C}์์ 'A'๋ผ๋ ๊ณตํต ์์๊ฐ ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
์ ๋ฆฌํ๋ฉด i๋ฒ์งธ ์์์ j๋ฒ์งธ ์์๊ฐ ๊ฐ๋ค๋ฉด (i-1, j-1)์ LCS ๊ธธ์ด์ +1์ด ๋๋ค.
์ด๋ฅผ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 15828KB
์๊ฐ : 96ms
import java.io.*;
public class Main {
static char[] str1, str2;
static int[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// ๋ ๋ฌธ์์ด ์
๋ ฅ
str1 = br.readLine().toCharArray();
str2 = br.readLine().toCharArray();
bw.append(lcs(str1.length, str2.length) + "\n");
bw.flush();
bw.close();
br.close();
}
private static int lcs(int a, int b) {
dp = new int[a+1][b+1];
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
// ๊ฐ์ ๋ฌธ์๊ฐ ๋ค์ด์จ๋ค๋ฉด
// ๋ชจ๋ ์์ด์ ๊ฐ์ ๋ฌธ์๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ
// ๊ทธ๋ฌ๋ฏ๋ก ๋๊ฐ์ ์ ์๋ ๊ฐ์ +1
if (str1[i-1] == str2[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]);
}
}
return dp[a][b];
}
}
๐ reference