BOJ 9252
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();
}
}