코딩테스트/BOJ

[백준][DP][LCS] 9251. LCS(최장공통부분수열)

박소민 2024. 2. 28. 21:18
9251. LCS
 

9251번: LCS

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

www.acmicpc.net

 

  • 풀이
    • 아래 설명 보고 원리 이해
    • LCS(Xi, Yj)를 문자열 X, Y 각각의 i, j번째 글자까지의 최장 공통 부분 문자열의 길이라고 했을 때
X[i] == Y[j]일 때 : LCS(Xi, Yj) = LCS(Xi - 1, Yj - 1) + 1
X[i] != Y[j]일 때 : LCS(Xi, Yj) = max(LCS(Xi - 1, Yj), LCS(Xi, Yj - 1))
https://velog.io/@piopiop/%EB%B0%B1%EC%A4%80-9251-LCS-%ED%8C%8C%EC%9D%B4%EC%8D%AC
 

[백준 9251] LCS (파이썬)

백준 9251 - LCS풀이를 찾아봐도 쉽게 이해되지 않아 직접 정리하며 이해하기 위해 포스팅을 하게 되었다. DP 문제는 내가 똑똑하지 않다는 것을 너무 적나라하게 보여주지만 풀었을 때의 쾌감도

velog.io

 

a = list(input().rstrip())
b = list(input().rstrip())
n = len(a)
m = len(b)
dp = [[0 for _ in range(m+1)] for _ in range(n+1)]
for i in range(1, n+1):
    for j in range(1, m+1):
        if a[i-1] == b[j-1]:
            dp[i][j] = dp[i-1][j-1]+1
        else:
            dp[i][j] = max(dp[i-1][j], dp[i][j-1])

print(dp[n][m])