[백준 1958] LCS 3(Java)

최민길(Gale)·2023년 11월 26일
1

알고리즘

목록 보기
157/172

문제 링크 : https://www.acmicpc.net/problem/1958

이 문제는 dp를 이용하여 풀 수 있습니다.

공통 문자를 구하는 방법은 다음과 같습니다.

  1. 첫 번째 문자의 i번째 문자와 두 번째 문자의 j번째 문자, 세 번째 문자의 k번째 문자가 모두 같고 각각의 전 문자들 역시 모두 같다면 dp[i][j][k] = dp[i-1][j-1][k-1]+1
  2. 그렇지 않다면 dp[i][j][k] = Math.max(dp[i - 1][j][k], Math.max(dp[i][j - 1][k], dp[i][j][k - 1]));

원리는 단순합니다. 각각의 인덱스의 문자가 같고 그 이전도 같다면 dp값을 증가시켜주고, 그렇지 않다면 이전 dp값 중 최댓값을 가져오게 되면 dp의 가장 끝 값에 최댓값이 저장됩니다. 이를 리턴하면 됩니다.

다음은 코드입니다.

import java.util.*;
import java.io.*;

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

        int[][][] dp = new int[first.length() + 1][second.length() + 1][third.length() + 1];

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

        System.out.println(dp[first.length()][second.length()][third.length()]);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글

관련 채용 정보