728x90
코드
package Baekjoon.Class;
import java.io.*;
import java.util.ArrayList;
public class P_9252 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] seq1 = br.readLine().split("");
String[] seq2 = br.readLine().split("");
int len1 = seq1.length;
int len2 = seq2.length;
int[][] dp = new int[len1 + 1][len2 + 1];
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (seq1[i - 1].charAt(0) == seq2[j - 1].charAt(0)) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
int i = len1, j = len2;
ArrayList<String> lcs = new ArrayList<>();
while (dp[i][j] != 0) {
if (seq1[i - 1].charAt(0) == seq2[j - 1].charAt(0)) {
lcs.add(seq1[i - 1]);
i--; j--;
}
else {
if (dp[i - 1][j] > dp[i][j - 1]) i--;
else j--;
}
}
bw.write(dp[len1][len2] + "\n");
for (int k = lcs.size() - 1; k >= 0; k--) bw.write(lcs.get(k));
bw.flush();
}
}
코드 설명
2022.07.10 - [코딩테스트_JAVA/백준] - P.9251 LCS
P.9251 LCS
코드 import java.io.*; public class P_9251 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
castlehi.tistory.com
위 문제와 유사한데 LCS의 요소까지 구해야 하는 문제이다.
이미 LCS의 길이를 구하면서 LCS의 요소가 무엇인지 알고 있는 상태이다.
seq1[i][j] 와 seq2[i][j]의 요소가 같다면 LCS의 길이를 증가시켰으므로 seq1[i][j] == seq2[i][j]인 부분이 LCS의 요소가 된다.
결국 알고리즘은 seq1[i][j] == seq2[i][j]인 부분을 찾아 되짚어 가는 코드가 된다.
728x90
'코딩테스트 > 백준' 카테고리의 다른 글
P.17404 RGB거리 2 (0) | 2023.08.21 |
---|---|
P.10942 팰린드롬? (0) | 2023.08.19 |
P.2239 스도쿠 (0) | 2023.08.17 |
P.1647 도시 분할 계획 (0) | 2023.08.17 |
P.1197 최소 스패닝 트리 (0) | 2023.08.17 |