알고리즘
[백준 알고리즘] 9252번 LCS 2 최장 공통 부분 수열. 파이썬(python)
삶은겨란
2022. 10. 21. 19:54
역추적을 할 때 현재-1이 왼쪽, 위랑 같을 때 공통된 문자로 취급
처음에 왼쪽==위 일 때 공통되었다고 생각했는데
dp가
1 1
1 1
과 같이 값이 세 개가 다같은 경우가 있어서 안됨
import sys
input=sys.stdin.readline
s1=input().rstrip()
s2=input().rstrip()
dp=[[0]*(len(s2)+1) for _ in range(len(s1)+1)]
answer=''
for i in range(1,len(s1)+1):
for j in range(1,len(s2)+1):
if s1[i-1]==s2[j-1]:
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=max(dp[i-1][j], dp[i][j-1])
# dp배열을 역추적하면서 값을 찾는다.
i=len(s1)
j=len(s2)
while dp[i][j]!=0:
if dp[i][j]-1==dp[i-1][j] and dp[i][j]-1==dp[i][j-1]:
answer=s1[i-1]+answer
i-=1
j-=1
else:
if dp[i-1][j]>dp[i][j-1]: # 위>왼쪽
i-=1
else: # 위<왼쪽
j-=1
print(dp[-1][-1])
print(answer)