https://www.acmicpc.net/problem/9251
< LCS >
이 문제는 두 문자열을 받아와서 공통돤 최장 수열을 찾아 그것이 몇 개의 알파벳으로 이루어져 있는 지 출력해주는 문제이다.
예제 입력 1
ACAYKP CAPCAK
예제 출력 1
4
예제 입력을 보면 ACAYKP 와 CAPCAK를 비교하는데 이 입력의 답은 ACAYKP / CAPCAK으로 ACAK, 4를 출력해주면 된다.
하나의 수열을 두고 LCS를 구하는 문제는 풀어보았지만, 두 문자열을 가지고 공통된 최장 문자열을 찾는 것은 풀기 힘들었다.
https://www.youtube.com/watch?v=P-mMvhfJhu8&t=335s
위 링크의 유투브 영상을 참고했는데 정말 쉽게 잘 설명해주어서 보자마자 문제를 풀 수 있었다.
문제와 풀이가 단순하면서 재미있었다. 다만, 백준에서는 공통된 문자열의 길이만 출력하도록 하게 했지만
유투브 영상 뒤에서 공통된 문자열이 무엇인지 알 수 있는 방법을 소개시켜주었기 때문에 이 후에 공통된 문자열을
출력해주는 알고리즘도 구현해보아야 겠다.
#include <iostream> #include <string> #define SIZE 1010 using namespace std; int dp[SIZE][SIZE]; inline int MAX(int a, int b) { return a > b ? a : b; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); string s1, s2; cin >> s1 >> s2; int s1Size = s1.length(); int s2Size = s2.length(); for (int i = 1; i <= s1Size; ++i) { for (int j = 1; j <= s2Size; ++j) { if (s1[i - 1] == s2[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[s1Size][s2Size] << '\n'; return 0; }
'알고리즘 > 백준 문제풀기' 카테고리의 다른 글
BOJ 백준 2869 달팽이는 올라가고 싶다 <수학> (0) | 2019.01.31 |
---|---|
BOJ 백준 3053 택시 기하학 < 기하 알고리즘 > (0) | 2019.01.30 |
BOJ 백준 2162 선분 그룹 <선분 교차> (0) | 2019.01.09 |
BOJ 백준 2857 FBI <문자열 처리> (0) | 2019.01.06 |
콜라한캔 :: BOJ 백준 민균이의 비밀번호<문자열 처리> (0) | 2019.01.05 |