์ฐ์ ๊ธฐ๋ก ๐ช
[C++ ์๊ณ ๋ฆฌ์ฆ] LCS, Longest Common Subsequence ๋ณธ๋ฌธ
[C++ ์๊ณ ๋ฆฌ์ฆ] LCS, Longest Common Subsequence
kite707 2025. 2. 20. 16:12๊ฐ์
LCS(Longest Common Subsequence)๋ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด๋ก, ๋ ๋ฌธ์์ด ์ฌ์ด ๊ณตํต๋๋ ๋ถ๋ถ์ ๋งํ๋ค. ์ฆ ๋ฌธ์์ด์ ์๋์ ์ธ ์์๋ง ๊ฐ์ผ๋ฉด ๋๋ค.
์๋ฅผ๋ค์ด ์๋์ ๊ฐ์ด 2๊ฐ์ ๋ฌธ์์ด์ด ์์ ๋
LCS๋ ABCCE์ด๋ค.
์ด๋ฐ LCS๋ DP๋ฅผ ํ์ฉํด์ ๊ตฌํ๋ค.
๊ณผ์
๋จผ์ AABCCDE์ A์ ๊ณตํต๋ถ๋ถ์ ๊ตฌํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ํ์๋ ํ์ฌ๊น์ง ๊ฐ์ฅ ๊ธด ๊ณตํต๋ถ๋ถ์ ๊ธธ์ด๋ฅผ ์ ์ฅํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ํ๋ ์๋์ ๊ฐ์ด ๋๋ค. (A๋ ๊ธธ์ด๊ฐ 1์ด๋ ์ต๋ ๊ณตํต๋ถ๋ถ์ ๊ธธ์ด๋ 1์ด๋ค.)
์ด์ AABCCDE์ AB์ ์ต์ฅ๊ณตํต๋ถ๋ถ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํด๋ณด๋๋ก ํ์. ๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผ ํ๋ ๋ถ๋ถ์ ๊ณตํต๋๋ ๋ถ๋ถ์ธ B๊ฐ ๋์์ ๋์ด๋ค. ์ ๊ณณ์ AAB์ AB์ LCS์ ๊ธธ์ด๋ฅผ ๊ธฐ๋กํ ๋ถ๋ถ์ธ๋ฐ AB๊ฐ ๊ณตํต์์ด์ด ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋์ผ๋ก ๋ณด๋ฉด ์ ์ ์์ง๋ง dp์ ๊ด์ ์์ ์๊ฐํด๋ณด๋๋ก ํ์.
AAB์ AB์ LCS๊ฐ AB๋ผ๋ ๊ฒ์ ๋ค๋ฅธ๋ง๋ก AA์ A์ LCS์ธ A์ B๋ฅผ ์ถ๊ฐํ ๊ฒ์ด๋ค. ์ฆ ๊ฐ์ ๋ฌธ์๋ฅผ ์ฐพ์์ ๋์ ์ ํ์์ ์๋์ ๊ฐ๋ค.
// ๊ฐ์ ๋ฌธ์๋ฅผ ๋ง๋ฌ์ ๋
dp(i-1)(j-1) + 1
๊ทธ๋ผ ์ผ์นํ์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ด ๋ถ๋ถ์ ์ดํดํ๊ธฐ ์ํด ๋ค์ ๋จ๊ณ์ธ AABC์ AB์ LCS๋ฅผ ์ฐพ์๋ณด๋๋ก ํ์. ์ด๊ฒ ์ญ์ ์ฐ๋ฆฌ๋ AB๋ผ๋ ๊ฒ์ ์๊ณ ์๊ณ , 2๊ฐ ๊ธฐ๋ก๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์๋ค.
์ฆ AABC์ AB์ LCS๋ AABC์ A์ LCS, AAB์ AB์ LCS์ค ๊ธด ๊ฒ๊ณผ ๊ฐ๋ค. ๊ทธ๋ ๊ธฐ์ AB์ ๊ธธ์ด์ธ 2๋ฅผ ๊ธฐ๋กํ๋ค.
C์ ๋ํด์๋ ์ฑ์ฐ๋ฉด ์๋์ ๊ฐ์ด ๋๋ค. ๊ฐ์ด ๊ฐ์ ๋์๋ ๋๊ฐ์ ์์ ๊ฐ์ ธ์ค๊ณ , ๊ฐ์ด ๋ค๋ฅผ ๋์๋ ์ฌํ๊น์ง์ LCS์ค ๊ธด ๊ฒ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค.
์ด๋ฐ๋ฐฉ์์ผ๋ก ํ๋ฅผ ์ญ ์ฑ์๋๊ฐ๋ฉด ์๋์ ๊ฐ์ด ๋๋ค. ์์ ๊ตฌํ LCS ABCCE์ ๊ธธ์ด 5๊ฐ ๋์๋ค.
์ฝ๋
์ด๊ฒ์ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ์๋์ ๊ฐ๋ค.
#include <iostream>
#include <algorithm>
using namespace std;
int dp[1001][1001];
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
string s1,s2;
cin>>s1>>s2;
int s1Len=s1.length();
int s2Len=s2.length();
for(int i=1;i<=s1Len;i++){
for(int j=1;j<=s2Len;j++){
char curChar1=s1[i-1];
char curChar2=s2[j-1];
if(curChar1==curChar2){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[s1Len][s2Len];
}
์ฐ์ต๋ฌธ์
https://www.acmicpc.net/problem/9251
'Computer Science > ์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++ ์๊ณ ๋ฆฌ์ฆ] ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ (0) | 2025.02.25 |
---|---|
[C++ ์๊ณ ๋ฆฌ์ฆ] ๋ฌดํฅ๊ทธ๋ํ ์ฌ์ดํด dfs (0) | 2025.01.21 |
[C++ ์๊ณ ๋ฆฌ์ฆ] ํต์ ๋ ฌ (2) | 2024.11.26 |
[C++] ๋ฒกํฐ ํ์ (0) | 2021.09.07 |
[C++] ์ซ์ ์๋ฆฟ์ ๋ํ๊ธฐ (0) | 2021.09.07 |