-
[백준] 9252번 LCS2문제 풀이 2020. 4. 10. 00:16
9252 LCS2
문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를, 둘째 줄에 LCS를 출력한다.
LCS가 여러 가지인 경우에는 아무거나 출력하고, LCS의 길이가 0인 경우에는 둘째 줄을 출력하지 않는다.
풀이)
딱히 설명할 것이 없다. LCS알고리즘을 이용해 푼 간단한 문제이다.
코드)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include <stdio.h>#include <string>#include <algorithm>#include <iostream>#include <vector>using namespace std;string f, s;int dp[1001][1001];int main() {cin >> f >> s;// 첫번째행과 첫번째열이 0이여야하니깐 계산상 편의를 위해 문자열 앞에 의미없는 걸 붙여둔다.f.insert(f.begin(), '0');s.insert(s.begin(), '0');//1. 테이블 채우기for (int i = 1; i < f.length(); i++) {for (int j = 1; j < s.length(); j++) {if (f[i] == s[j]) { // 문자가 같다면, 왼쪽 대각선 값 + 1dp[i][j] = dp[i - 1][j - 1] + 1;}else {//문자가 다르면, 왼쪽과 위쪽 값 중 큰 값dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);}}}printf("%d\n", dp[f.length()-1][s.length()-1]);vector <char> temp;//2. 문자열 구하기int i = f.length() - 1;int j = s.length() - 1;while (dp[i][j] != 0) {//같은 숫자있다면 이동if (dp[i][j] == dp[i][j - 1]) {j -= 1;}else if (dp[i][j] == dp[i - 1][j]) {i -= 1;}else if (dp[i][j] == dp[i - 1][j - 1] + 1) {temp.insert(temp.begin(),f[i]); //거꾸로 삽입되지 않기 위해, 처음에 계속 삽입i -= 1;j -= 1;}}for (int i = 0; i < temp.size(); i++) {printf("%c", temp[i]);}return 0;}cs 결과)
'문제 풀이' 카테고리의 다른 글
[백준] 13904번 과제 (0) 2020.04.11 [백준] 1395번 스위치 (0) 2020.04.11 [백준] 1654번 랜선 자르기 (0) 2020.04.08 [백준] 17836번 공주님을 구해라 (0) 2020.04.07 [백준] 3048번 개미 (0) 2020.04.06