이 험난한 세상에서어어~

백준, LCS2(9252, java) 본문

algorithm/코딩 테스트

백준, LCS2(9252, java)

토끼띠NJW 2023. 7. 29. 15:16

문제 설명

두 수열이 주어졌을 때, LCS의 길이와 LCS를 구하는 문제이다.

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

 

9252번: LCS 2

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

www.acmicpc.net

문제 풀이

첫 번째 접근

https://jiwonna52.tistory.com/71

 

LCS(Longest Common Subsequence, 최장 공통 부분 수열) java

LCS란? 부분 수열 LCS는 최장 공통 부분 수열로 두 개의 수열이 주어졌을 때, 공통 수열 중 제일 긴 것을 의미한다. 예를 들어서 abcf와 aebwcd가 있다고 생각해 보자. 그렇다면 여기서 나오는 LCS는 abc

jiwonna52.tistory.com

LCS에 관해 정리해둔 글에 문제 풀이가 나와 있다. 사실, 해당 문제도 특별히 응용하는 것보다 알고리즘 자체만 알면 풀 수 있다.

코드

java

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String str1 = br.readLine();
        String str2 = br.readLine();

        int length1 = str1.length();
        int length2 = str2.length();

        int[][] dp = new int[length1+1][length2+1];

        for(int i=0; i<length1; i++){
            dp[i][0] = 0;
        }

        for(int i=0; i<length2; i++){
            dp[0][i] = 0;
        }

        for(int i=1; i<length1+1; i++){
            for(int j=1; j<length2+1; j++){
                //만일 두 문자가 같으면
                if(str1.charAt(i-1) == str2.charAt(j-1)){
                    dp[i][j] = 1 + dp[i-1][j-1];
                }else{
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
                }
            }
        }
        /*
        for(int i=0; i<length1; i++){
            for(int j=0; j<length2; j++){
                System.out.print(dp[i][j]);
            }
            System.out.println();
        }*/

        //맨 뒤에서부터 문자를 확인
        int index1 = length1;
        int index2 = length2;
        while(true){

            if(index1 <= 0 || index2 <= 0){
                break;
            }

            if(dp[index1][index2] == dp[index1-1][index2]){
                index1--;
            }else if(dp[index1][index2] == dp[index1][index2-1]){
                index2--;
            }else{
                sb.append(str1.charAt(index1-1));
                index1--;
                index2--;
            }
        }

        String answer = sb.reverse().toString();
        System.out.println(answer.length());
        if(answer.length() != 0){
            System.out.println(answer);
        }
    }
}