PS

[백준] 9252번 : LCS 2[Java]

devkdh 2025. 7. 22. 18:14

 

#풀이

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
       BufferedReader br =  new BufferedReader(new InputStreamReader(System.in));
       String word1,word2;
       word1 = br.readLine();
       word2 = br.readLine();
       int[][]dp = new int[word2.length()+1][word1.length()+1];

       for(int i = 1; i<word2.length()+1; i++){
           for(int j = 1; j<word1.length()+1; j++){
               if(word2.charAt(i-1)==word1.charAt(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]);
           }
       }
       StringBuilder sb = new StringBuilder();
       int i = word2.length();
       int j = word1.length();
       while(i>0 && j>0){
           if(word2.charAt(i-1)==word1.charAt(j-1)){
               sb.append(word2.charAt(i-1));
               i--;
               j--;

           }
           else if(dp[i-1][j]>dp[i][j-1])i--;
           else j--;
       }


       System.out.println(dp[word2.length()][word1.length()]);
       System.out.println(sb.reverse());

    }
}

#성능

#정리

LCS알고리즘(dp) 문제이다.


dp[i][j]는 word2의 i번째까지, word1의 j번째까지 비교했을 때의 LCS 길이를 의미한다.

점화식은 아래와 같다.
문자가 같으면: dp[i][j] = dp[i-1][j-1] + 1
다르면: dp[i][j] = max(dp[i-1][j], dp[i][j-1])

LCS문자열 구하기: DP 테이블의 오른쪽 아래(dp[n][m])부터 시작해 두 문자가 같으면 해당 문자를 결과 문자열에 추가하고 대각선(↖)으로 이동, 다르면 더 큰 값이 있는 방향(↑ or ←)으로 이동 거꾸로 구했기 때문에 마지막에 reverse()로 뒤집어 출력한다.