LCS 2
문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를, 둘째 줄에 LCS를 출력한다.
LCS가 여러 가지인 경우에는 아무거나 출력하고, LCS의 길이가 0인 경우에는 둘째 줄을 출력하지 않는다.
예제 입력
ACAYKP
CAPCAK
예제 출력
4
ACAK
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String A = br.readLine();
String B = br.readLine();
int dp[][]=new int[A.length()+1][B.length()+1];
for (int i = 1; i <= A.length(); i++) {
for (int i2 = 1; i2 <= B.length(); i2++) {
if (A.charAt(i-1)==B.charAt(i2-1)) {
dp[i][i2]=dp[i-1][i2-1]+1;
}
else {
dp[i][i2]=Math.max(dp[i][i2-1],dp[i-1][i2]);
}
}
}
System.out.println(dp[A.length()][B.length()]);
StringBuilder sb = new StringBuilder();
int i = A.length(), j = B.length();
while (i > 0 && j > 0) {
if (A.charAt(i - 1) == B.charAt(j - 1)) {
sb.append(A.charAt(i - 1));
i--;
j--;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
} else {
j--;
}
}
// LCS 문자열 출력
System.out.println(sb.reverse().toString());
}
}
'백준(Java)' 카테고리의 다른 글
| [백준] 13458번 시험 감독 (자바) (1) | 2025.05.24 |
|---|---|
| [백준] 9251번 LCS (자바) (0) | 2025.05.20 |
| [백준] 10974번. 모든 순열 (자바) (0) | 2025.05.15 |
| [백준] 15649번. N과 M (1) (자바) (0) | 2025.05.15 |
| [백준] 18258번 '큐2' (자바/JAVA) (0) | 2025.04.30 |