알고리즘 문제풀이/백준
Baekjoon_9251_LCS
Treejin
2021. 4. 21. 22:09
반응형
문제 설명
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
- 두 개의 수열이 주어졌을 때
- 두 수열의 공통된 부분 수열 중 가장 긴 부분 수열의 길이를 출력
문제 풀이
LCS(Longest Common Subsequence, 최장 공통 부분 문자열)은 DP를 이용해 문제를 해결해야 한다.
LCS는 다음 3가지 경우로 나눌 수 있다.
- 비교 수열의 길이가 0 인 경우
=> 이 경우에는 값이 0 이다. - x수열의 i번째 문자와 y수열의 j번째 문자가 같은 경우
=> 이 경우에는 이전 단계(x수열의 i-1번째, y수열의 j-1번째까지의 비교)에서의 값 +1 이다. - x수열의 i번재 문자와 y수열의 j번째 문자가 다른 경우
=> 이 경우에는 x수열의 i번째와 y수열의 j-1번째, x수열의 i-1번째와 y수열의 j번째와 비교해서 최댓값 취한다.
문제 풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class _9251_LCS {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
char[] s1 = in.readLine().toCharArray();
char[] s2 = in.readLine().toCharArray();
int[][] lcs = new int[s1.length+1][s2.length+1];
for(int i = 1; i<= s1.length;++i) {
for(int j = 1; j<=s2.length;++j) {
if(s1[i-1] == s2[j-1]) {
//이번 문자가 같을 경우, 이전 경우의 수 +1
lcs[i][j] = lcs[i-1][j-1]+1;
}
else {
//이번 문자가 다를 경우, s1수열의 이전값과 s2수열의 이전 값 비교
lcs[i][j] = Math.max(lcs[i-1][j], lcs[i][j-1]);
}
}
}
System.out.println(lcs[s1.length][s2.length]);
}
}
반응형