코딩테스트/BOJ

[BOJ] 1958 LCS 3 - JAVA

5월._. 2023. 5. 8.
728x90

1. 문제

 

1958번: LCS 3

첫 줄에는 첫 번째 문자열이, 둘째 줄에는 두 번째 문자열이, 셋째 줄에는 세 번째 문자열이 주어진다. 각 문자열은 알파벳 소문자로 이루어져 있고, 길이는 100보다 작거나 같다.

www.acmicpc.net

문자열과 놀기를 세상에서 제일 좋아하는 영식이는 오늘도 문자열 2개의 LCS(Longest Common Subsequence)를 구하고 있었다. 어느 날 영식이는 조교들이 문자열 3개의 LCS를 구하는 것을 보았다. 영식이도 도전해 보았지만 실패하고 말았다.

이제 우리가 할 일은 다음과 같다. 영식이를 도와서 문자열 3개의 LCS를 구하는 프로그램을 작성하라.

첫 줄에 첫 번째 문자열과 두 번째 문자열과 세 번째 문자열의 LCS의 길이를 출력한다.


2. 풀이

기본 LCS알고리즘을 3차원으로 확장시키면 바로 해결되는 문제다.

세 문자열의 글자가 모두 같다면 [i-1][j-1][k-1]+1, 다르다면 세 방향 dp의 최댓값을 저장한다.

[LCS 문제] 에 있는 알고리즘 설명과 동일한 방식이므로 설명은 생략한다. (3차원이라 그림 그리기도 어렵다 ^^;ㅎ)

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

public class BOJ_1958_LCS3 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      char[] str1 = in.readLine().toCharArray();
      char[] str2 = in.readLine().toCharArray();
      char[] str3 = in.readLine().toCharArray();

      int[][][] lcs = new int[str1.length + 1][str2.length + 1][str3.length + 1];
      for (int i = 1; i <= str1.length; i++) {
         for (int j = 1; j <= str2.length; j++) {
            for (int k = 1; k <= str3.length; k++) {
               if (str1[i - 1] == str2[j - 1] && str2[j - 1] == str3[k - 1]) {
                  lcs[i][j][k] = lcs[i - 1][j - 1][k - 1] + 1;
               } else {
                  lcs[i][j][k] = Math.max(lcs[i - 1][j][k], Math.max(lcs[i][j - 1][k], lcs[i][j][k - 1]));
               }
            }
         }
      }

      System.out.println(lcs[str1.length][str2.length][str3.length]);
   }
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 2636 치즈 - JAVA  (1) 2023.05.17
[BOJ] 20304 비밀번호 제작 - JAVA  (0) 2023.05.16
[BOJ] 9252 LCS 2 - JAVA  (0) 2023.05.07
[BOJ] 9251 LCS - JAVA  (0) 2023.05.06
[BOJ] 2294 동전 2 - JAVA  (0) 2023.05.05

댓글