Python/코딩테스트
[DP] BOJ 9251 LCS
권멋져
2023. 4. 5. 20:20
문제
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
풀이
1. 인덱스를 수월하게 사용하기 위해 더미 문자열을 입력 문자열 앞에 추가한다.
2. 이중 for를 돌면서 각 문자를 서로 비교한다. DP 테이블에는 현재까지 만들 수 있는 공통 부분 수열의 개수를 넣는다.
2-1. 만약 i위치와 j위치에서 두 문자가 같다면 [i-1][j-1]에 값에 1을 더한다.
(두 문자열의 각각 이전 문자까지의 공통 문자열 길이에 현재 문자를 더한 것이다. )

2-2. 만약 i위치와 j위치에서 두 문자가 다르다면 서로 이전의 값 중에서 큰값을 넣는다.
(두 문자열에 대해서 이전 값을 유지하는 과정)

3. 2번을 반복한다.

다른 케이스의 예

코드
import sys
line1 = '.' + sys.stdin.readline().rstrip()
line2 = '.' + sys.stdin.readline().rstrip()
len1 = len(line1)
len2 = len(line2)
d = [[0] * len(line1) for _ in range(len(line2))]
for i in range(1,len1):
for j in range(1,len2):
if line1[i] == line2[j]: #2-1
d[j][i] = d[j-1][i-1]+1
else: #2-2
d[j][i] = max(d[j][i-1],d[j-1][i])
print(d[len2-1][len1-1])