LCS

Huisu·2023년 10월 12일
0

Coding Test Practice

목록 보기
44/98
post-thumbnail

문제

9251번: LCS

문제 설명

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

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

제한 사항

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.

입출력 예

입력출력
ACAYKP
CAPCAK4

아이디어

다이나믹프로그래밍이다

디피가 어려울 것 같았는데, bfs에서 distance 구하는 것과 비슷하게 접근하면 될 것 같다.

만약에 순회를 돌다가 알파벳이 같다면 하나 더 추가된 값을 넣고, 아니라면 전과 똑같은 값을 업데이트하는 것이다.

제출 코드


package com.example.javacodingtest.boj.gold;
// https://www.acmicpc.net/problem/9251

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

public class five9251 {
    static int[][] dp;
    static char[] first;
    static char[] second;
    public void solution() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        first = reader.readLine().toCharArray();
        second = reader.readLine().toCharArray();
        dp = new int[first.length + 1][second.length + 1];

        for (int i = 1; i <= first.length; i++) {
            for (int j = 1; j <= second.length; j++) {
                if (first[i - 1] != second[j - 1]) {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
                else {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
            }
        }

        int max = Integer.MIN_VALUE;
        for(int[] row : dp) {
            for(int value : row) {
                max = Math.max(max, value);
            }
        }
        System.out.println(max);
    }

    public static void main(String[] args) throws IOException {
        new five9251().solution();
    }
}

0개의 댓글