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