๐ ๋ฌธ์ ๋งํฌ
๋ ๋ฌธ์์ด A์ B๊ฐ ์ฃผ์ด์ก์ ๋,
๋ ๋ฌธ์์ด์ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(Longest Common Subsequence, LCS) ์ ๊ตฌํ๋ ๋ฌธ์ ์.
์๋ฅผ ๋ค์ด, A = "ACAYKP", B = "CAPCAK"์ธ ๊ฒฝ์ฐ LCS๋ "ACAK"์.
AACAAABAA
AAACAABAA
dp[i][j]
: A์ ์ฒ์ i ๊ธ์์ B์ ์ฒ์ j ๊ธ์์ ๋ํด ๊ตฌํ LCS์ ๊ธธ์ด.dpDir[i][j]
: LCS์ ๊ธธ์ด๊ฐ ๊ฐฑ์ ๋ ๋, ํด๋น ๊ฐ์ด ์ด๋์ ์ ์ด๋์๋์ง ๊ธฐ๋กํ๋ ํฌ์ธํฐ ๋ฐฐ์ด.import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static StringTokenizer st;
private static StringBuilder sb = new StringBuilder();
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
String A = br.readLine();
String B = br.readLine();
// dp ๋ฐฐ์ด: LCS์ ๊ธธ์ด๋ฅผ ์ ์ฅ
int[][] dp = new int[A.length() + 1][B.length() + 1];
// dpDir ๋ฐฐ์ด: ๋ฐฑํธ๋ํน ํฌ์ธํฐ ์ ์ฅ (์ด๋ ๋ฐฉํฅ์์ ๊ฐฑ์ ๋์๋์ง)
int[][] dpDir = new int[A.length() + 1][B.length() + 1];
// DP ํ
์ด๋ธ ์ฑ์ฐ๊ธฐ
for (int i = 1; i <= A.length(); i++) {
for (int j = 1; j <= B.length(); j++) {
if (A.charAt(i - 1) == B.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + 1;
dpDir[i][j] = 1; // ๋๊ฐ์ ๋ฐฉํฅ
} else {
if (dp[i][j - 1] > dp[i - 1][j]) {
dp[i][j] = dp[i][j - 1];
dpDir[i][j] = 2; // ์ผ์ชฝ ๋ฐฉํฅ
} else {
dp[i][j] = dp[i - 1][j];
dpDir[i][j] = 3; // ์์ชฝ ๋ฐฉํฅ
}
}
}
}
// LCS์ ๊ธธ์ด ์ถ๋ ฅ
System.out.println(dp[A.length()][B.length()]);
// LCS ๋ฌธ์์ด ๋ณต์ (๋ฐฑํธ๋ํน)
if (dp[A.length()][B.length()] != 0) {
int x = A.length();
int y = B.length();
while (x > 0 && y > 0) {
if (dpDir[x][y] == 1) {
sb.append(A.charAt(x - 1));
x--;
y--;
} else if (dpDir[x][y] == 2) {
y--;
} else {
x--;
}
}
sb.reverse();
System.out.println(sb.toString());
}
}
}