๐Ÿ’œ๊ฐœ๋ฐœ๊ณผ ์ผ์ƒ (โ‰ง∇โ‰ฆ)๏พ‰

[๋ฐฑ์ค€ c++] 9251 LCS (๊ณจ5) ๋ณธ๋ฌธ

CS/๋ฐฑ์ค€

[๋ฐฑ์ค€ c++] 9251 LCS (๊ณจ5)

๊ฐ•์˜์„œ 2023. 4. 3. 11:04

๐Ÿ“Œ ๋ฌธ์ œ

Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ง์ ‘์ ์œผ๋กœ ๋ฌธ์ œ์˜ ๊ทœ์น™์„ ์•Œ๋ ค์ฃผ์ง€ ์•Š์ง€๋งŒ ์•”๋ฌต์ ์ธ ๊ทœ์น™์ด ์กด์žฌํ•œ๋‹ค.์ผ๋‹จ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋งŒ๋“ค ๋•Œ ๋ฌด์กฐ๊ฑด ์ˆ˜์—ด ๋‚ด ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋ฅผ ์ง€์ผœ์•ผํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

 

ํ•„์ž๋Š” ์ด ๋ฌธ์ œ๊ฐ€ DP๋กœ ํ’€๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ•˜์ง€?? ๋ง‰๋ง‰ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ DP๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด๋‚ด๋ฉด ๊ธˆ๋ฐฉ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋‹ค.

 

๋จผ์ € ๋ฌธ์ž์—ด ๋ณ„๋กœ ๋ฐฐ์—ด์„ ๋‘ ๊ฐœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. 

 

 

 

๐Ÿ’ป ์ •๋‹ต ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	//์ฒซ์งธ ์ค„๊ณผ ๋‘˜์งธ ์ค„์— ๋‘ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. 
	//๋ฌธ์ž์—ด์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ตœ๋Œ€ 1000๊ธ€์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
	string str1, str2;  cin >> str1 >> str2;
	int M = str1.size();
	int N = str2.size();

	vector<vector<int>> dp(M+1);
	for (int i = 0; i < M + 1; i++) dp[i].resize(N + 1, 0);

	//๋น„๊ต ์ง„ํ–‰ํ•˜๊ธฐ
	
	for (int i = 0; i < M ; i++){
		for (int j = 0; j < N ; j++) {

			//๊ฐ™์„ ๊ฒฝ์šฐ
			if (str1[i] == str2[j]) dp[i + 1][j + 1] = dp[i][j] + 1;

			//๋‹ค๋ฅผ ๊ฒฝ์šฐ
			else dp[i + 1][j + 1] = dp[i][j + 1] > dp[i + 1][j] ? dp[i][j + 1] : dp[i + 1][j];

		}
	}

	cout << dp[M][N] << endl;
	return 0;
}