9251번: LCS
import sys
input = sys.stdin.readline
words = []
for _ in range(2):
words.append(list(map(str,input().rstrip())))
a = len(words[0])
b = len(words[1])
dp = [[0]*(b+1) for _ in range(a+1)]
for i in range(1,a+1):
for j in range(1,b+1):
if words[0][i-1] == words[1][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[a][b])
동적 계획법의 가장 기본이지 대표 문제인 최장 공통 부분 수열이다.
먼저 리스트 words에 두 문자열을 rstrip을 이용해 한 단어씩 받아준다.
그 후 두 단어의 문자열 길이를 a, b에 넣어주고 리스트 dp에 (b+1)개의 0을 갖는 리스트를 (a+1)개 만들어준다.
이런식으로 리스트를 만들면 2중 반복문을 통해 dp 리스트안에 있는 리스트 요소들 속 0을 모두 공통부분수열로 만들 수 있다.
2중 반복문 속에 if 문을 이용해 words의 0번째 index속 i-1 과 1번째 index 속 j-1 이 같다면
dp[i][j] = dp[i-1][j-1] + 1
즉 직전 최댓값에 +1 을 해주면 된다.
else 라면 dp[i][j] = max(dp[i][j-1],dp[i-1][j]) 를 통해 최댓값을 부여한다.
가장 마지막 값인 dp[a][b]를 출력하면 최댓값을 받을 수 있다.
Author And Source
이 문제에 관하여(9251번: LCS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mae03087/9251번-LCS저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)