acmicpc

[BAEKJOON] 9252. LCS2

코드와이 2021. 6. 30. 08:35

 

문제링크

https://www.acmicpc.net/problem/9252

 

9252번: LCS 2

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

 

package acmicpc.Gold5;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class LCS2 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String s1 = br.readLine();
		String s2 = br.readLine();
		int r = s1.length();
		int c = s2.length();
		
		int[][] dp = new int[r+1][c+1];
		
		for(int i = 1 ; i <= r ; i++) {
			for(int j = 1 ; j <= c ; j++) {
				dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
				if(s1.charAt(i-1) == s2.charAt(j-1)) dp[i][j] = dp[i-1][j-1] + 1;
			}
		}
		String ans = "";
		
		int r2 = r;
		int c2 = c;
		int tmp = dp[r2][c2];
		while(true) {
			
			if(tmp == dp[r2-1][c2]) {
				r2--;
				tmp = dp[r2][c2];
			} else if( tmp == dp[r2][c2-1]) {
				c2--;
				tmp = dp[r2][c2];
			} else {
				ans = s2.charAt(c2-1) + ans;
				r2--;
				c2--;
				tmp = dp[r2][c2];
			}
			
			if( r2 <= 0 || c2 <= 0 ) break;
		}
		
		System.out.println(dp[r][c]);
		System.out.println(ans);
	}
}