[백준] 9252_LCS 2 C++
in Study on Coding Test
DP를 활용하는 문제
정답제출코드
#include <iostream>
#include <string>
#define MAX 1001
using namespace std;
int dp[MAX][MAX];
string a, b;
int m_max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
void DFSPrint(int i, int j)
{
if(dp[i][j] == 0)
return;
if(a[i-1] == b[j-1])
{
DFSPrint(i-1, j-1);
cout << a[i-1];
}
else
{
if (dp[i-1][j] > dp[i][j-1])
DFSPrint(i-1,j);
else
DFSPrint(i,j-1);
}
}
int main()
{
cin >> a;
cin >> b;
int aLen = a.length();
int bLen = b.length();
for (int i = 1; i < aLen+1; ++i)
{
for (int j = 1; j < bLen+1; ++j)
{
if (a[i-1] == b[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = m_max(dp[i-1][j], dp[i][j-1]);
}
}
cout << dp[aLen][bLen] << '\n';
DFSPrint(aLen, bLen);
return 0;
}
제한시간 0.1초라는 것을 보고 경악을 했으나,
LCS 문제도 0.1초라는 것을 보고 안심하였다.
이 문제는 위 링크에 있는 문제에서 더 나아가서 문자열까지 출력하는 문제인 것이다.
따라서 이전에 풀었던 LCS문제의 코드에다가 문자열을 출력하는 부분만 붙이면 되는 것이다.
void DFSPrint(int i, int j)
{
if(dp[i][j] == 0)
return;
if(a[i-1] == b[j-1])
{
DFSPrint(i-1, j-1);
cout << a[i-1];
}
else
{
if (dp[i-1][j] > dp[i][j-1])
DFSPrint(i-1,j);
else
DFSPrint(i,j-1);
}
}
결국 추가로 구현한 코드는 이부분이다.
그리고 지역변수에 있던 문자열 변수 string a, b는 전역변수로 옮겨주었다.
DFS를 이용해서 출력을 진행하였다.