개발/algorithm
[백준 9251번] LCS -python
zzi_on2
2022. 1. 27. 14:29
문제 링크
https://www.acmicpc.net/problem/9251
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
풀이 -다른 블로그 참고 https://twinw.tistory.com/126
- dp 문제이다.
- 주어진 두 문자열의 최장 공통 부분 수열을 구하는 것인데 주의해야될 점은, 연속되지 않아도 되므로 같은 길이의 다른 해가 나타날 수도 있다.
- 이전 행의 값을 기반으로 현재 행의 값이 계산된다는 점에서 메모제이션 문제이다.
1. 같은 문자가 나오면, 이전까지의 LCS 값(왼쪽 대각선 위) 에 + 1
2. 문자가 다르면, 비교한 문자가 포함되어 있기 직전의 LCS 값 중 큰값
코드로 표현하면
1. string1[n] == string2[k] : dp[n][k] == dp[n-1][k-1] + 1
2. string1[n] != string2[k] : dp[n][k] == max( dp[n-1][k], dp[n][k-1] )
a = list(str(input()))
b = list(str(input()))
dp = [[0 for _ in range(len(a)+1)] for _ in range(len(b)+1)]
answer = 0
for i in range(len(a)):
for j in range(len(b)):
# 문자가 같으면 대각선 왼쪽의 값
if a[i] == b[j]:
dp[j+1][i+1] = dp[j][i] + 1
answer = max(answer, dp[j+1][i+1])
# 문자가 다르면 왼쪽이나 위쪽 중 큰 값
else :
dp[j+1][i+1] = max(dp[j][i+1], dp[j+1][i])
print(answer)