https://www.acmicpc.net/problem/9252
9252번: LCS 2
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
문제
풀이
두 문자열(arr1,arr2) 을 문자 하나하나 비교하는것에서 시작을 해야한다.
( arr1 를 i 로 순차탐색 ) ( arr2 를 j 로 순차탐색)
차례대로 (i, j)비교하다가 만약 문자 하나가 같은경우 => arr1[i] == arr2[j] 일 경우 카운트를 증가시킨다.
이것을 끝날때 까지 진행하면 된다.
하지만 이대로하면 중복되는부분이 있는데다가 , 특정 공통문자가 앞에있을때 뒤에있을때 등 모두 따져봐야하므로
3중포문 => O(n^3) 이 되므로 당연히 시간초과 발생.
그럼 다시 탐색하지않게 하기위해 기존의 결과를 메모이제이션으로 기록해뒀다가 써야하므로 DP로 접근.
(i,j) 위치에서 두 문자열의 공통되는 부분수열의 길이를 n이라고 하면
DP(i,j) = n 으로 나타낼수 있다.
1. (i,j)에서 같은 문자가 발견될경우 , i , j 한칸 전진한 값에 +1 => DP(i+1,j+1) = DP(i,j)+1
2. 같지 않을 경우 , DP(i+1,j+1) 의 값은 DP(i+1,j) or DP(i,j+1) 중 큰 값이랑 동일하므로
최종점화식은 다음과 같다.
for(int i=0;i<arr1.length;i++)
for(int j=0;j<arr2.length;j++)
dp[i+1][j+1] = arr1[i]==arr2[j] ? dp[i][j]+1 : Math.max(dp[i+1][j],dp[i][j+1]);
즉 , 오른쪽 대각선 아래방향으로 Bottom-Up 방식으로 누적 합을 나타내는 방식으로 값을 다 구하면
제일 오른쪽 밑의 값에서 부터 올라오면서 추적하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
import java.util.*;
import java.io.*;
import java.util.stream.Collectors;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] arr1 = br.readLine().toCharArray();
char[] arr2 = br.readLine().toCharArray();
int[][] dp = new int[arr1.length+1][arr2.length+1];
for(int i=0;i<arr1.length;i++)
for(int j=0;j<arr2.length;j++)
dp[i+1][j+1] = arr1[i]==arr2[j]
? dp[i][j]+1 : Math.max(dp[i+1][j],dp[i][j+1]);
StringBuilder answer = new StringBuilder();
int i = arr1.length;
int j = arr2.length;
while(i>=1 && j>=1){
if(dp[i][j] == dp[i-1][j])
i--;
else if(dp[i][j] == dp[i][j-1])
j--;
else {
answer.insert(0, arr2[j - 1]);
i--; j--;
}
}
System.out.println(answer.length());
System.out.println(answer);
}
}
|
cs |
'알고리즘,PS > 백준' 카테고리의 다른 글
[BOJ] 백준 [5719] 거의 최단 경로 JAVA (0) | 2021.10.02 |
---|---|
[BOJ] 백준 [2533] 사회망 서비스(SNS) JAVA (0) | 2021.09.30 |
[BOJ] 백준 [1005] ACM Craft JAVA (0) | 2021.09.28 |
[BOJ] 백준 [14002] 가장 긴 증가하는 부분수열4 JAVA (0) | 2021.09.27 |
[BOJ] 백준 [1365] 꼬인 전깃줄 JAVA (0) | 2021.09.24 |