알고리즘 모음(C++)

백준 9252 - LCS 2(C++, 복습) 본문

백준

백준 9252 - LCS 2(C++, 복습)

공대생의 잡다한 사전 2023. 1. 23. 19:36

문제 링크입니다. https://www.acmicpc.net/problem/9252

 

9252번: LCS 2

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

LCS를 사용한 문제입니다.

해당 문제에서 변형된 문제이니, 문제를 풀고 와주시면 좋을거 같습니다. ->  https://junseok.tistory.com/170

 

 

LCS 문제에서 추가된 것은 수열까지 출력하는 것입니다.

쉽게 생각할 수 있는 방법은 수열을 저장하면서 푸는 방법인데 이는 시간초과로 실패했습니다.

 

따라서 역추적을 하는 방법을 이용했습니다.

dp 배열의 (X.size(), Y.size())에는 구할 수 있는 가장 긴 수열의 길이가 저장되어 있습니다.

(X, Y)의 값을 얻었을 때, 비교했던 위치를 살펴보면, (X-1, Y) / (X, Y-1) / (X-1, Y-1) 입니다.

그렇다면 3개의 값을 비교하면서 큰 값으로 돌아간다면, 원하는 수열을 찾을 수 있을 것입니다.

이때, 찾으려는 위치에서 수열의 값이 같다면, (X-1, Y-1)로 돌아가야 합니다. 

 

 

자세한 것은 코드를 참고해주세요

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>
#include <stack>

using namespace std;

string X, Y;
int dp[1001][1001];

int Max(int x, int y, int z, bool add) {
	int ans = 0;
	if (add) {
		ans = max(x, y);
		ans = max(ans, z + 1);
	}
	else {
		ans = max(x, y);
		ans = max(ans, z);
	}
	return ans;
}

void print(int x, int y){
    if(dp[x][y] == 0) return;
    if(X[x-1] == Y[y-1]){
        print(x-1, y-1);
        cout << X[x-1];
    }
    else dp[x-1][y] > dp[x][y-1] ? print(x-1,y):print(x,y-1);
}

void solve() {
	for (int i = 1; i <= X.size(); i++) {
		for (int j = 1; j <= Y.size(); j++) {
			if(X[i-1] == Y[j-1]) dp[i][j] = Max(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] , true);
			else dp[i][j] = Max(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1], false);
		}
	}
	cout << dp[X.size()][Y.size()] << "\n";
	print(X.size(), Y.size());
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> X >> Y;
	solve();
	return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요

'백준' 카테고리의 다른 글

백준 1450 - 냅색 문제(C++)  (0) 2023.01.24
백준 1208 - 부분수열의 합 2(C++, 복습)  (0) 2023.01.23
백준 2629 - 양팔저울(C++)  (0) 2023.01.20
백준 7579 - 앱(C++)  (0) 2023.01.19
백준 2580 - 스도쿠(C++)  (0) 2023.01.19