본문 바로가기

알고리즘/백준

[9251] LCS(C++)

1. 문제

 

2. 접근 방법

- 못풀어서 해답을 찾아보았다.

http://melonicedlatte.com/algorithm/2018/03/15/181550.html

 

[백준] 9251번 C/C++ 풀이 _ LCS - Easy is Perfect

출처 : https://www.acmicpc.net/problem/9251  시간 제한메모리 제한제출정답맞은 사람정답 비율1 초128 MB76453240240041.746% 문제LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, �

melonicedlatte.com

-  dp[i][j] : s1.substr(0,i) , s2.substr(0,j)의 LCS 길이 (i번째, j 번째 문자열을 선택했을 때가 아님)

   s1[i] == s2[j]이면, dp[i][j] = dp[i-1][j-1] + 1 (이전까지의 최장 길이 + 1, LCS가 갱신됨) 

   s1[i] != s2[j]이면, dp[i-1][j] 와 dp[i][j-1] 중 큰 값 (LCS자체는 갱신이 안됨. 표를 채우기 위한 과정)

 

 

3. 실수 한 것 & 깨달은 점

- 나는 해답을 볼 때 "내가 풀었던 방식이랑 해답이랑 어떤 차이가 있는지"를 찾는데 오래걸린다. 중요한 경우인데 문제는 너무.. 많이,, 걸린다는 것이다. 특히 아예 첫 단추부터 다르게 접근했을 때 오래걸린다. 당분간은 "해답을 이해하는데" 집중하고 어느 정도 실력이 향상되면 그 때 "해답과의 차이"에 집중해야 시간을 절약할 수 있을 것 같다..

 

-그리디와 dp의 차이를 아직 헷갈려한다. 그나마 다행인건 문제를 접근할 때 "앗 이거 그리디인데" 라는 느낌은 이제 어느정도 온다. 하지만 깨닫기만 하고 dp로 푸는 방법으로 가지는 못한다  좀 더 많이 풀어보자.

 

4. 코드 

더보기
#include<iostream>
#include<string>
#include<algorithm>

using namespace std;


void solution(string s1, string s2) {

	if(s1.length() > s2.length()) swap(s1,s2);
	int dp[1001][1001] = {0,};

	for(int i=1;i<=s1.length();i++) {
		for(int j=1;j<=s2.length();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[s1.length()][s2.length()];

}

int main() {
	ios_base::sync_with_stdio(NULL);
	cin.tie(0);

	string s1,s2;
	cin >> s1 >> s2;

	solution(s1,s2);
	return 0;
}

 

'알고리즘 > 백준' 카테고리의 다른 글

[16235]나무 재테크(C++/구현)  (2) 2020.07.02
[백준] DP  (0) 2020.07.02
[백준]수학1  (0) 2020.06.17
[1010]다리 놓기(C++)/DP  (1) 2020.06.16
[1932] 정수 삼각형(C++)/DP  (2) 2020.06.16