(python3)
9252번: LCS 2
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
LCS 문제
유명한 DP 유형이라 따로 정리해보았습니다.
LCS (Longest Common Subsequence, 최장 공통 부분 수열)
두가지 LCS 두 문자열의 연속된 공통 부분 : longest common substring 두 문자열의 공통 부분 : longest common subsequence DP 이 문제의 핵심 풀이법은 DP 입니다. 연속된 공통 부분 (LCSubstring) 찾기 1. DP 채우기
jamong-5.tistory.com
파이썬 코드
import sys
def solution(input) :
str1 = '_'+input().strip() # 코딩 편의성을 위해 앞에 더미 문자 하나 패딩
str2 = '_'+input().strip()
DP = [[0 for _ in range(len(str2))] for _ in range(len(str1))]
# DP 채우기
for i1 in range(1,len(str1)) :
for i2 in range(1,len(str2)) :
if str1[i1] == str2[i2] :
DP[i1][i2] = DP[i1-1][i2-1] + 1
else :
DP[i1][i2] = max(DP[i1-1][i2], DP[i1][i2-1])
# LCS 찾기
result = []
i1 = len(str1)-1
i2 = len(str2)-1
print(DP[i1][i2]) # LCS 길이 출력
while True :
if DP[i1][i2] == 0 : break
if DP[i1][i2-1] == DP[i1][i2] :
i2-=1
elif DP[i1-1][i2] == DP[i1][i2] :
i1-=1
else :
result.append(str1[i1])
i1-=1
i2-=1
result.reverse()
print(''.join(result))
input = sys.stdin.readline
solution(input)
my solved.ac :
solved.ac
알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.
solved.ac
'Algorithem > 백준 PS with code' 카테고리의 다른 글
백준 #15989 - [S1] 1,2,3 더하기 4 : DP (0) | 2023.07.03 |
---|---|
백준 #20922 - [S1] 겹치는 건 싫어 : 두포인터 (0) | 2023.06.30 |
백준 #1138 - [S2] 한 줄로 서기 (0) | 2023.06.27 |
백준 #2075 - [S2] N번째 큰 수 : 최소힙 (0) | 2023.06.26 |
백준 #1713 - [S1] 후보 추천하기 : 정렬 (0) | 2023.06.24 |