본문 바로가기

프로그래밍

[백준 9251 LCS] 파이썬 풀이

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

 

입력 첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력 첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
풀이전략 1. 이차원 배열에 DP 값을 저장합니다. 
2. DP[i][j]는 첫 번째 수열의 i 번째까지와 두 번째 수열의 j 번째까지 공통된 부분 수열의 최대 길이 입니다. 
3. 만일 A[i]와 B[j]가 같다면 DP[i-1][j-1]에서 하나를 추가한 경우 입니다. 
4. 만일 A[i]와 B[j]가 다르다면 max(DP[i][j-1], DP[i-1][j])입니다. 
주의사항 입력으로 들어오는 두 개 수열의 길이가 다를 수 있습니다. 따라서 DP를 위한 이차원 배열도 두 개의 길이를 바탕으로 구성해야 합니다.  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
= input().strip()
= input().strip()
 
dp = [[0 for j in range(len(b)+1)] for i in range(len(a)+1)]
 
for i in range(len(a)):
    for j in range(len(b)):
        if a[i]==b[j]:
            dp[i+1][j+1]=dp[i][j] + 1
        else:
             dp[i+1][j+1]=  max(dp[i+1][j], dp[i][j+1])
 
print(dp[-1][-1])
 
 
cs