일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- C++
- 순환참조
- javascript
- 양방향 매핑
- AWS
- @Transactional
- JPA
- html
- matplotlib
- yolo
- google cloud
- idToken
- skt fellowship 3기
- STT
- google login
- Loss Function
- 졸프
- Spring
- marksense.ai
- google 로그인
- pandas
- Spring Boot
- oauth
- 2021 제9회 문화공공데이터 활용경진대회
- 코드업
- OG tag
- Expo
- YOLOv5
- 커스텀 데이터 학습
- react native
Archives
- Today
- Total
민팽로그
[백준 / BOJ] 9251번 : LCS 본문
https://www.acmicpc.net/problem/9251
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
코드
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int dp[1001][1001];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
string a, b;
cin >> a >> b;
for (size_t i = 0; i < a.length(); i++) {
for (size_t j = 0; j < b.length(); j++) {
if (a[i] == b[j]) dp[i + 1][j + 1] = dp[i][j] + 1;
else dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
}
}
cout << dp[a.length()][b.length()];
return 0;
}
어떻게 풀어야 할지 너무 생각이 안나서 결국 다른 사람들의 풀이를 참고했다. 참고하고 나니 학교에서 알고리즘 수업시간에 LCS에 관해 배웠던 것이 갑자기 새록새록 기었났다.. 이래서 복습은 참 중요한 것 같다.
LCS는 Longest Common Subsequence의 약자로, 최장 공통 부분 수열을 나타내는 용어이다. 이를 구하기 위한 아이디어는 다음과 같다.
- a[i]와 b[j]의 문자가 같다면, 이것은 곧 a[i-1]와 b[j-1] 다음으로 공통 문자가 나온다는 의미이다. 따라서 a[i]와 b[j]까지의 문자열에 대한 LCS 길이는 a[i-1]와 b[j-1]까지의 문자열에 대한 LCS길이에 1을 더한 값이다.
- a[i]와 b[j]의 문자가 다르다면, a[i]와 b[j]까지의 문자열에 대한 LCS 길이는 a[i]와 b[j-1]까지의 문자열에 대한 LCS 길이 또는 a[i-1]와 b[j]까지의 문자열에 대한 LCS 길이 중 큰 값을 갖는다.
ACAYKP, CAPCAK 두 개의 문자열에 대해 를 과정을 표로 나타내면 아래와 같다.
0 | A | C | A | Y | K | P | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
C | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A | 0 | ||||||
P | 0 | ||||||
C | 0 | ||||||
A | 0 | ||||||
K | 0 |
0 | A | C | A | Y | K | P | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
C | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
P | 0 | ||||||
C | 0 | ||||||
A | 0 | ||||||
K | 0 |
0 | A | C | A | Y | K | P | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
C | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
P | 0 | 1 | 1 | 2 | 2 | 2 | 3 |
C | 0 | ||||||
A | 0 | ||||||
K | 0 |
0 | A | C | A | Y | K | P | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
C | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
P | 0 | 1 | 1 | 2 | 2 | 2 | 3 |
C | 0 | 1 | 2 | 2 | 2 | 2 | 3 |
A | 0 | ||||||
K | 0 |
0 | A | C | A | Y | K | P | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
C | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
P | 0 | 1 | 1 | 2 | 2 | 2 | 3 |
C | 0 | 1 | 2 | 2 | 2 | 2 | 3 |
A | 0 | 1 | 2 | 3 | 3 | 3 | 3 |
K | 0 |
0 | A | C | A | Y | K | P | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
C | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A | 0 | 1 | 1 | 2 | 2 | 2 | 2 |
P | 0 | 1 | 1 | 2 | 2 | 2 | 3 |
C | 0 | 1 | 2 | 2 | 2 | 2 | 3 |
A | 0 | 1 | 2 | 3 | 3 | 3 | 3 |
K | 0 | 1 | 2 | 3 | 3 | 4 | 4 |
'PS > 백준📖' 카테고리의 다른 글
[백준 / BOJ] 12865: 평범한 배낭 (0) | 2021.12.15 |
---|---|
[백준 / BOJ] 1912번: 연속합 (0) | 2021.12.15 |
[백준 / BOJ] 2565번: 전깃줄 (0) | 2021.12.11 |
[백준 / BOJ] 11053번: 가장 긴 증가하는 부분 수열 (0) | 2021.12.11 |
[백준 / BOJ] 2156: 포도주 시식 (0) | 2021.12.11 |
Comments