[Problem Solving - Baekjoon] 9251 LCS
[Baekjoon Online Judge] 9251 LCS
문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
예제
- input
ACAYKP
CAPCAK
- output
4
분류
- 동적프로그래밍
풀이
문제 파악
- 수열 중 가장 긴 것을 찾는 동적 프로그래밍 문제
- 첫째줄은 x축 둘째줄은 y축에 둠
- x와 y의 문자가 같으면 x-1, y-1 값의 +1
- x와 y의 문자가 다르면 x열 이전값, y열 이전 값과 비교하여 더 큰 값 가져오기
0 | C | A | P | C | A | K | |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
A | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
C | 0 | 1 | 1 | 1 | 2 | 2 | 2 |
A | 0 | 1 | 2 | 2 | 2 | 3 | 3 |
Y | 0 | 1 | 2 | 2 | 2 | 3 | 3 |
K | 0 | 1 | 2 | 2 | 2 | 3 | 4 |
P | 0 | 1 | 2 | 3 | 3 | 3 | 4 |
구현
int[][] dp = new int[x.length+1][y.length+1];
dp[0][0] = 0;
for (int i = 1; i < x.length+1; i++) {
for (int j = 1; j < y.length+1; j++) {
if (x[i-1] == y[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[x.length][y.length]);