9252번: LCS 2

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

www.acmicpc.net


 

DP를 이용하자!

아래 문제와 비슷하니 자세한 원리 설명은 아래 글에서 보면 된다.

 

[백준 9251] LCS (python)

9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된..

hillier.tistory.com

 

  1. 행이 A+1 열이 B+1 dp 배열을 생성한다. (default = "")
  2. for문을 돌면서 A[i-1]B[j-1]의 문자가 같다면 이전 것(dp[i-1][j-1])에서 현재 문자를 더해준다.
  3. 아니라면 이전 행(dp[i-1][j]) 또는 열(dp[i][j-1]) 값 중 길이가 긴 값으로 update 해준다.

 

import sys
input = sys.stdin.readline


A = input().rstrip()
B = input().rstrip()

dp = [[""]*(len(B)+1) for _ in range(len(A)+1)]

for i in range(1, len(A)+1):
    for j in range(1, len(B)+1):
        if A[i-1] == B[j-1]:
            dp[i][j] = dp[i-1][j-1]+A[i-1]
        else:
            left = dp[i][j-1]
            up = dp[i-1][j]
            if len(left) < len(up):
                dp[i][j] = up
            else:
                dp[i][j] = left


result = dp[len(A)][len(B)]
print(len(result))
if len(result):
    print(result)
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기