ยซ   2025/04   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Recent Posts
04-13 22:03

Today
Total

Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

์—ฐ์˜ ๊ธฐ๋ก ๐Ÿช

[C++ ์•Œ๊ณ ๋ฆฌ์ฆ˜] LCS, Longest Common Subsequence ๋ณธ๋ฌธ

Computer Science/์ž๋ฃŒ๊ตฌ์กฐ & ์•Œ๊ณ ๋ฆฌ์ฆ˜

[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