알고리즘||코딩테스트/백준

[백준 9251번] LCS - JAVA

째로스 2023. 7. 18. 22:38

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

 

9251번: LCS

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

www.acmicpc.net

풀이

사용한 알고리즘 : DP, LCS(Longest Common Subsequence)

 

풀이전략

1. 주어진 두 문자열 길이에 맞게 이차원 배열을 선언한다.

   int d[][] = new d[두번째문자열.length()+1][첫번째문자열.length()+1]

2. 문자열에서 동일한 문자가 있을 경우 D[i+1][j+1]=D[i][j]+1

   문자열에서 동일한 문자가 없을 경우 D[i+1][j+1]=Math.max(D[i+1][j],D[i][j+1])

   이라는 패턴을 찾을 수 있으므로 DP를 사용하여 바텀업해 이차원 배열을 채운다.

   ex) d[4][2]는 첫 번째 문자열 중 {A,C}와 두 번째 문자열{CAPC} 사이의 LCS 값이 저장된다.

3. 이차원 배열을 채워가면서 가장 큰 값을 저장해뒀다가 출력한다.

 

제출코드

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

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

        int d[][] = new int[str2.length()+1][str1.length()+1];
        int maxVal=0;

        for(int i=0;i<str2.length();++i){
            for(int j=0;j<str1.length();++j){
                if(str2.charAt(i)==str1.charAt(j)){
                    d[i+1][j+1]=d[i][j]+1;
                }
                else{
                    d[i+1][j+1]=Math.max(d[i][j+1],d[i+1][j]);
                }
                maxVal=(maxVal<d[i+1][j+1])?d[i+1][j+1]:maxVal;
            }
        }
        System.out.println(maxVal);
    }
}