Algorithm

[BOJ] LCS 9251번 C++

따봉치치 2025. 2. 28. 15:31
728x90

 

 

문제

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

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

입력

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

출력

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

 

 

접근 방식

 

유명한 LCS 문제이다

dp배열을 2차원 배열으로 두고, 문자 A,B가 있을 때

dp[i][j] = A의 앞 i개 문자와 B의 앞 j개 문자로 만들 수 있는 LCS의 최대 길이로 두고 풀이하면 된다

 

문자 A와 B를 반복문을 통해 순회하면서

만약 현재 A와 B의 부분 문자가 같다면 dp값을 +1해주고

아니라면 dp[i-1][j], dp[i][j-1] 값 중 큰 값을 선택하면 된다!

 

코드

#include<bits/stdc++.h>
using namespace std;

int dp[1003][1003]; // A의 앞 i개 문자와 B의 앞 j개 문자로 만들 수 있는 LCS의 길이
int main() {
    string s1, s2; cin>>s1>>s2;
    int n = s1.length();
    int m = s2.length();

    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            if(s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1]+1;
            else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
        }
    }

    cout<<dp[n][m];
}
728x90