알고리즘/PS - 백준

[백준 9251 - C++] LCS : 다이나믹 프로그래밍 (DP)

excited-hyun 2021. 2. 19. 12:19
반응형

www.acmicpc.net/problem/9251

 

9251번: LCS

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

문제

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

 

입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

 

출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.

 

예제 입력 1 

ACAYKP

CAPCAK

예제 출력 1 

4

 

풀이

LCS알고리즘을 그대로 적용하기만 하면 끝나는 문제이다.

ACAYKP

CAPCAK

위의 두 문자열을 비교하는 경우 lcs를 적용하여 lcs table을 나타내면 아래와 같이 된다.

  0 C A P C A K
0 0 0 0 0 0 0 0
A 0 0 1 1 1 1 1
C 0 1 1 1 2 2 2
A 0 1 2 2 2 3 3
Y 0 1 2 2 2 3 3
K 0 1 2 2 2 3 4
P 0 1 2 3 3 3 4

LCS알고리즘에 대해서 간단하게 말하자면

서로 같은 문자일 경우에는 table의 왼쪽 위의 값에 1을 더한 값이된다.

서로 다른 문자일 경우에는 table의 왼쪽 값과 위쪽 값 중 더 큰 값을 취하게 된다.

 

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char input1[1000];
char input2[1000];

int lcs[1001][1001];

int Max(int a, int b) {
    if(a>b)
        return a;
    else
        return b;
}

int main(void){
    int len1, len2;
    scanf("%s", input1);
    scanf("%s", input2);
    
    len1 = strlen(input1);
    len2 = strlen(input2);
    for(int i=0; i<len1; i++){
        for(int j=0; j<len2; j++){
            if(input1[i] == input2[j]){
                lcs[i+1][j+1] = lcs[i][j] + 1;
            }
            else{
                lcs[i+1][j+1] = Max(lcs[i][j+1], lcs[i+1][j]);
            }
        }
    }
    
    
    
    printf("%d\n", lcs[len1][len2]);
}
728x90
반응형