Home 백준 9251번 LCS
Post
Cancel

백준 9251번 LCS

정보

문제 바로가기 [클릭]

난이도: Gold5

관련 개념: #다이나믹 프로그래밍


조건

시간 제한메모리 제한
1 초256 MB

문제

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

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


입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.


출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.


예제 입출력 1

입력

1
2
ACAYKP
CAPCAK

출력

1
4

코드(파이썬)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys


line1 = sys.stdin.readline().rstrip()
line2 = sys.stdin.readline().rstrip()

if len(line1) > len(line2):
    line1, line2 = line2, line1

dp = [0 for _ in range(len(line2)+1)]

for ch1 in line1:
    tmp = dp.copy()
    
    for j, ch2 in enumerate(line2, 1):
        if ch1 == ch2:
            tmp[j] = dp[j-1] + 1
        else:
            tmp[j] = max(dp[j], tmp[j-1])
    dp = tmp

print(dp[-1])


특이사항

  • DP로 해결할 수 있는 문제 중 하나
  • 두 문자열이 같을 떄 값을 갱신하는 방식에서 헤매어 다음 참고문헌을 통해 학습

참고문헌

This post is licensed under CC BY 4.0 by the author.

백준 9465번 Stickers

백준 9935번 문자열 폭발

Comments powered by Disqus.