BOJ 9252. LCS 2
๐โโ๏ธ[Gold IV] LCS 2 - 9252
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 5984 KB, ์๊ฐ: 4 ms
๋ถ๋ฅ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
์ ์ถ ์ผ์
2024๋ 2์ 22์ผ 15:31:44
๋ฌธ์ ์ค๋ช
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ, ๋์งธ ์ค์ LCS๋ฅผ ์ถ๋ ฅํ๋ค.
LCS๊ฐ ์ฌ๋ฌ ๊ฐ์ง์ธ ๊ฒฝ์ฐ์๋ ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํ๊ณ , LCS์ ๊ธธ์ด๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ ๋์งธ ์ค์ ์ถ๋ ฅํ์ง ์๋๋ค.
๐ํ์ด
LCS๊ฐ ์ต๋ ๊ธธ์ด๋ง ์ ์ ์๋๋ฐ cache๊ฐ์ ๋ฐํ์ผ๋ก ๊ฐ์ ์ญ ์ถ์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
string str1, str2;
cin >> str1 >> str2;
for (int i = 1; i <= str1.length(); ++i)
{
for (int j = 1; j <= str2.length(); ++j)
{
if (str1[i - 1] == str2[j - 1])
{
cache[i][j] = cache[i - 1][j - 1] + 1;
}
else
{
cache[i][j] = max(cache[i - 1][j], cache[i][j - 1]);
}
}
}
cout << cache[str1.length()][str2.length()] << '\n';
์ด๋ ๊ฒ cache๋ฅผ ์ฑ์์ฃผ๊ณ ์ต๋ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค.
if (cache[str1.length()][str2.length()] == 0)
return;
else
{
int f = str1.length();
int s = str2.length();
// ๊ทธ ์์ด์ ์ฐพ์์ผ๋จ
string str;
// ์์ด์ ์ญ ์ถ์ ํ๊ธฐ
int idx = str2.size();
for (int i = str1.size(); i > 0; --i)
{
for (int j = idx; j > 0; --j)
{
if (cache[i][j] == cache[i - 1][j])
{
idx = j;
break;
}
else if (cache[i][j] == cache[i][j - 1])
continue;
else
str = str1[i - 1] + str;
}
}
cout << str;
}
cache๋ฅผ ๋ฐํ์ผ๋ก ์ญ ์ถ์ ์ ์์ํ๋๋ฐ
cache๋ ๋ฌธ์ ์ ์์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ์ด๋ ๊ฒ๋๋ค.
์ด๋ 4๋ถ๋ถ๋ถํฐ ๊ฐ์ ๊ฐ์ ธ์ค๋๋ฐ cache[i][j] == cache[i - 1][j]
๋ผ๋ฉด idx๋ฅผ j๋ก ์นํ.
cache[i][j] == cache[i][j - 1]
๋ผ๋ฉด ๊ทธ๋ฅ ๋๊ธฐ๊ณ
์ต์ข
์ ์ผ๋ก ๊ทธ๊ฒ ์๋๋ฉด str = str1[i - 1] + str;
๋ก ํ์ฌ ์ต์ข
๊ฐ์ ์์ฑํ๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
// LCS (Longest Common Subsequence) 2
vector<vector<int>> cache(1001, vector<int>(1001));
void LCS()
{
string str1, str2;
cin >> str1 >> str2;
for (int i = 1; i <= str1.length(); ++i)
{
for (int j = 1; j <= str2.length(); ++j)
{
if (str1[i - 1] == str2[j - 1])
{
cache[i][j] = cache[i - 1][j - 1] + 1;
}
else
{
cache[i][j] = max(cache[i - 1][j], cache[i][j - 1]);
}
}
}
cout << cache[str1.length()][str2.length()] << '\n';
if (cache[str1.length()][str2.length()] == 0)
return;
else
{
int f = str1.length();
int s = str2.length();
// ๊ทธ ์์ด์ ์ฐพ์์ผ๋จ
string str;
// ์์ด์ ์ญ ์ถ์ ํ๊ธฐ
int idx = str2.size();
for (int i = str1.size(); i > 0; --i)
{
for (int j = idx; j > 0; --j)
{
if (cache[i][j] == cache[i - 1][j])
{
idx = j;
break;
}
else if (cache[i][j] == cache[i][j - 1])
continue;
else
str = str1[i - 1] + str;
}
}
cout << str;
}
}
void solve()
{
LCS();
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}