algorithm

BOJ 9252

rkawk 2022. 10. 5. 22:40
๋”๋ณด๊ธฐ

LCS 2 ์„ฑ๊ณต ์ŠคํŽ˜์…œ ์ €์ง€

 
0.1 ์ดˆ (ํ•˜๋‹จ ์ฐธ๊ณ ) 256 MB 26357 9345 7222 38.384%

๋ฌธ์ œ

LCS(Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด)๋ฌธ์ œ๋Š” ๋‘ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋‘์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๋˜๋Š” ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ACAYKP์™€ CAPCAK์˜ LCS๋Š” ACAK๊ฐ€ ๋œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„๊ณผ ๋‘˜์งธ ์ค„์— ๋‘ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฌธ์ž์—ด์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ตœ๋Œ€ 1000๊ธ€์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋‘ ๋ฌธ์ž์—ด์˜ LCS์˜ ๊ธธ์ด๋ฅผ, ๋‘˜์งธ ์ค„์— LCS๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

LCS๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ธ ๊ฒฝ์šฐ์—๋Š” ์•„๋ฌด๊ฑฐ๋‚˜ ์ถœ๋ ฅํ•˜๊ณ , LCS์˜ ๊ธธ์ด๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ๋‘˜์งธ ์ค„์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

ACAYKP
CAPCAK

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

4
ACAK

๋‚ด๊ฐ€ ์ œ์ผ ๋ชปํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์งœ๋†“๊ณ  ๊ฒฝ๋กœ์ฐ๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

LCS๋Š” ๋„˜์–ด๊ฐ€๊ณ , ๊ฒฝ๋กœ๋ฅผ ์ฐ๋Š” ๋ฐฉ๋ฒ•์€ ์ด ๋ฌธ์ œ์˜ ์˜ˆ์ œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์—ˆ์„๋–„

0 1 1 1 1 1 
1 1 1 2 2 2 
1 2 2 2 3 3 
1 2 2 2 3 3 
1 2 2 2 3 4 
1 2 3 3 3 4 

์ด๋Ÿฐ ๋ฐฐ์—ด์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

 

์—ฌ๊ธฐ์„œ [N][M]๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๋ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ,

์ค‘์š”ํ•œ ์ ์€ ๋’ค์—์„œ ๊ฐ€๋ฏ€๋กœ [N][M]๋ฒˆ์งธ ์›์†Œ์— ํ•ด๋‹นํ•˜๋Š” s1[N], s2[M]์ด ๊ฐ™๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ LCS๊ฐ€ ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•œ ๊ฒƒ์ธ๊ฒƒ์„ ์•„๋Š”๊ฑฐ๋‹ค. 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” N, M์„ ๊ฐ๊ฐ -1ํ•ด์ฃผ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” s1[N], s2[M]์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

[N-1][M] ๋˜๋Š” [N][M-1]์„ ๊ณ„์‚ฐํ•ด ๋‹ค์Œ ์ธ๋ฑ์Šค๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค๋งŒ ๋‘๊ฐœ ๋‹ค ํ• ํ•„์š”๋Š” ์—†๊ณ , ์–ด์ฒ˜ํ”ผ ์œ„๋กœ๊ฐ€๋“  ์˜†์œผ๋กœ๊ฐ€๋“  ๋ฌด์กฐ๊ฑด ๊ฐ™์€ ์›์†Œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

#include <iostream>
#include <string>
using namespace std;
string s1, s2, ans;
int arr[1001][1001], arr2[1001];
int main(){
    cin>>s1>>s2;
    for(int i=1; i<=s1.size(); i++)
        for(int j=1; j<=s2.size(); j++){
            if(s1[i-1] == s2[j-1])
                arr[i][j] = arr[i-1][j-1]+1;
            else 
                arr[i][j] = max(arr[i-1][j], arr[i][j-1]);
        }
    int x = s1.size(), y=s2.size();
    while(x != 0 && y != 0){
        if(s1[x-1] == s2[y-1]){
            ans.push_back(s1[x-1]);
            x -= 1;
            y -= 1;
            continue;
        }
        if(arr[x][y] == arr[x-1][y])
            x -= 1;
        else if(arr[x][y] == arr[x][y-1])
            y -= 1;
    }
    cout<<arr[s1.size()][s2.size()]<<'\n';
    while(!ans.empty()){
        cout<<ans.back();
        ans.pop_back();
    }
}