728x90
https://www.acmicpc.net/problem/9251
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
< 풀이 방법 >
▶ 두 문자열 s1, s2를 각각 한 글자씩 비교하며 LCS를 저장할 2차원 dp배열 생성
-- (l1+1)*(l2+1) ( l1 : s1의 길이, l2 : s2의 길이 )
▶ s1_i 와 s2_j 가 같으면, LCS는 s1_i-1 와 s2_j-1까지의 LCS보다 하나 늘어남
☞ dp[i-1][j-1] + 1
▶ s1_i 와 s2_j 가 같지 않으면, LCS는 s1_i-1 와 s2_j까지의 LCS, s1_i 와 s2_j-1까지의 LCS 중 더 큰 값이 됨
☞ Max( dp[i-1][j], dp[i][j-1] )
알고리즘 참고 : 「쉽게 배우는 알고리즘」 (한빛아카데미)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine(), s2 = sc.nextLine();
int l1 = s1.length(), l2 = s2.length(), i, j;
int dp[][] = new int[l1+1][l2+1];
for( i = 1; i <= l1; i++ ) {
for( j = 1; j <= l2; j++ ) {
if( s1.charAt(i-1) == s2.charAt(j-1) )
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = Math.max( dp[i-1][j], dp[i][j-1] );
}
}
System.out.println( dp[l1][l2] );
sc.close();
}
}
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 12865 : 평범한 배낭 / 동적 계획법 1 (0) | 2020.06.20 |
---|---|
[백준(Baekjoon)][자바(java)] 1912 : 연속합 / 동적 계획법 1 (0) | 2020.06.20 |
[백준(Baekjoon)][자바(java)] 2565 : 전깃줄 / 동적 계획법 1 (0) | 2020.06.20 |
[백준(Baekjoon)][자바(java)] 11054 : 가장 긴 바이토닉 부분 수열 / 동적 계획법 1 (0) | 2020.06.20 |
[백준(Baekjoon)][자바(java)] 11053 : 가장 긴 증가하는 부분 수열 / 동적 계획법 1 (0) | 2020.06.19 |