728x90

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

 

9251번: LCS

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

www.acmicpc.net

 

 

 

풀이)

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

public class Main_BJ_9251_LCS {
    static Integer[][] dp;
    static char[] arr1, arr2;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str1 = br.readLine();
        String str2 = br.readLine();
        arr1 = str1.toCharArray();
        arr2 = str2.toCharArray();
        dp = new Integer[arr1.length][arr2.length];

        System.out.println(LCS(arr1.length-1, arr2.length-1));

    }//main
    //TOP DOWN
    private static int LCS(int x, int y){
        if(x < 0 || y < 0)
            return 0;

        //탐색 x
        if(dp[x][y] == null){
            dp[x][y] = 0;

            if(arr1[x] == arr2[y])
                dp[x][y] = LCS(x-1, y-1) + 1;

            else
                dp[x][y] = Math.max(LCS(x-1, y), LCS(x, y-1));
        }
        return dp[x][y];
    }//LCS

    //BOTTOM UP
    /*
    // 공집합 표현을 위해 인덱스가 한 줄씩 추가 됨
		int[][] dp = new int[length_1 + 1][length_2 + 1];

		// 1부터 시작 (index 0 은 공집합이므로 0의 값을 갖고있음)
		for(int i = 1; i <= length_1; i++) {
			for(int j = 1; j <= length_2; j++) {

				// (i-1)과 (j-1) 번째 문자가 서로 같다면
				if(str1[i - 1] == str2[j - 1]) {
					// 대각선 위 (i-1, j-1)의 dp에 +1 한 값으로 갱신
					dp[i][j] = dp[i - 1][j - 1] + 1;
				}

				// 같지 않다면 이전 열(i-1)과 이전 행(j-1)의 값 중 큰 것으로 갱신
				else {
					dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
				}
			}
		}

		// Top-Down 때와는 다르게 dp 인덱스가 한 줄씩 추가되었으므로 -1을 하지 않음
		System.out.println(dp[length_1][length_2]);
     */
}

이 문제는 좀 어려웠다.

각 문자열을 부분집합으로 생각해서 값이 같을때마다 더해가는 방법이 흥미로웠다.

알고리즘 설명대로 하면 Bottom Up 방법이 맞지만, Top Down 방법도 익힐겸 써보았다.

역시나... dp는 어렵다.... 화이팅 해봐야징...ㅠ

 

 

 

이 블로그에서 정말 친절하게 설명해 주셔서 이해를 할 수 있었다. 꼭 다시 풀어봐야지

https://st-lab.tistory.com/139

 

[백준] 9251번 : LCS - JAVA [자바]

www.acmicpc.net/problem/9251 9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAP

st-lab.tistory.com

 

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1152 단어의 개수(JAVA)  (0) 2023.03.23
백준 15663 N과 M(9) (JAVA)  (0) 2023.03.22
백준 1629 곱셈(JAVA)  (0) 2023.03.19
백준 4153 직각삼각형(JAVA)  (0) 2023.03.17
백준 10866 덱(JAVA)  (0) 2023.03.16

+ Recent posts