728x90
대표적인 dp문제이다.
하지만, 나는.. 바보같이 처음에 map써봤다가 당차게 틀려먹었다.. (대체 왜이러니..)
map쓰면 문자열을 계속 순회해야해서 시간복잡도에서 걸린다. 그리고 이건 대표적인 dp라서 그냥 내가 바보였던것으로.. 넘어갑시다.
아무튼, dp를 이용해서 각 부분 문자열에 대한 LCS 값을 구해나가면 된다!
여기서 dp의 경우의 수는 두가지인데,
- i번째 문자열 == j번째 문자열
이건 왼쪽 위 대각선 값에 +1 해주면된다. 왼쪽 위 대각선 값이 이전 문자열인 (i-1,j-1)의 LCS 값이기 때문! - i번째 문자열 != j번째 문자열
이건 왼쪽과 위 중 max값을 가져가면 된다.
<코드>
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string one, two;
cin >> one >> two;
int n = one.size();
int m = two.size();
int dp[1001][1001] = {0};
//빈문자열과의 LCS처리를 위해 1부터 시작
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(one[i-1]==two[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
}else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
cout << dp[n][m];
return 0;
}
728x90
'Algorithm > 백준과 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 LV2. 조이스틱 (0) | 2024.01.13 |
---|---|
[C++] 프로그래머스 LV1. 체육복 (1) | 2024.01.05 |
[C++] 15787. 기차가 어둠을 헤치고 은하수를 (1) | 2023.11.29 |
[C++] 1991. 트리 순회 (0) | 2023.11.28 |
[C++] 14940. 쉬운 최단거리 (2) | 2023.11.27 |