Today's special moments become memories of tomorrow.

BOJ

[백준 1958번] LCS 3 (java)

lotus lee 2021. 4. 13. 17:34

 

1958번: LCS 3

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

www.acmicpc.net

동적 계획법을 통한 최장 공통 수열을 구하는 문제이다.

보통은 두 문자열의 LCS를 구하는데, 이 문제는 세 개의 문자열의 LCS를 구해야 한다.

 

아래는 LCS(Lowest Common Subsequence)를 구하는 방법에 대한 글이다.

lotuslee.tistory.com/39?category=964787

 

LCS(Longest Common Subsequence)

LCS(Longest Common Subsequence) : 최장 공통 부분문자열 두 문자열에서 "공통되는 가장 긴 부분문자열"을 찾는 알고리즘 여기서 subsequence는 꼭 연속하지 않아도 되는 부분문자열이다. * 문자열에서 subst

lotuslee.tistory.com

 

처음에는 먼저 두 문자열의 LCS를 구한 후, 이 문자열과 나머지 한 개의 문자열의 LCS를 다시 구하여 문제를 풀었다.

그런데 계속 '틀렸습니다' 가 떴다.

이런식으로 두 문자열의 LCS을 먼저 구하게 되면, 반례가 생기게 된다.

 

예를 들어, 세 개의 문자열이 다음과 같을 때,

 

s1 : abbbccc
s2 : bbbaddd
s3 : cccddda

 

s1과 s2 문자열의 LCS는 "bbb"이고, "bbb"와 s3 문자열의 LCS는 없다. 즉, 길이가 0이 된다.

s2와 s3 문자열의 LCS는 "ddd"이고, "ddd"와 s1 문자열의 LCS는 없다. 즉, 길이가 0이 된다.

s1과 s3 문자열의 LCS는 "ccc"이고, "ccc"와 s2 문자열의 LCS는 없다. 즉, 길이가 0이 된다.

 

하지만, s1, s2, s3 문자열의 LCS는 "a"가 될 수 있다.

 

따라서 위처럼 두 문자열의 LCS를 우선적으로 구하면 원하는 결과를 얻을 수 없다.

 

이 문제를 해결하기 위해 3차원 배열을 만들어서 LCS를 구하였다.

원래 두 문자열 사이의 LCS를 구하는 코드에서 배열만 2차원에서 3차원으로 변경하고, 로직은 동일하게 하여 문제를 풀었다.

 

 

전체코드 :

 

 

'BOJ' 카테고리의 다른 글

[백준 1495번] 기타리스트 (java)  (0) 2021.04.19
[백준 1720번] 타일 코드 (java)  (0) 2021.04.16
[백준 10830번] 행렬 제곱 (java)  (0) 2021.04.10
[백준 1328번] 고층 빌딩 (java)  (1) 2021.04.09
[백준 4811번] 알약 (java)  (0) 2021.04.08