문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
예제 입력 1
ACAYKP
CAPCAK
예제 출력 1
4
LCS(Longest Common Subsequence)라고 한다.
두 파일을 비교할 때 쓰거나 생명공학의 염기서열? 같은 것을 찾을 때 쓴다고 한다.
많은 분들의 블로그와 코드를 봤다.
거의 비슷비슷하다.(나도 같다)
그래서 코드 설명은 다른 분들 것을 보는게 훨씬 깔끔하다.
알고리즘의 이해는
https://twinw.tistory.com/126 이분 것이 제일 설명이 잘되어 있다. 진짜 최고다.
대신 언어는 자바를 쓰신다..
그 때 이분 것을 보면 된다. https://suri78.tistory.com/11
그렇기에 내가 이 문제를 해결하면서 의문점이 들었고, 왜 그런건지 이해한 점을 설명한다.
1. 왜 앞에 리스트들의 0을 붙여주는가?? 0 붙이지 않고 할 수 있는 거 아닌가? 생명공학쪽에서의 뭔가 필요한가?
2. if문으로 같을 때, i-1,j-1을 해줘야하는가?? i,j로 하는게 맞는 것 아닌가?
사실 간단한 의문점이지만, 직접 이해하기 전까지 몰랐다.
코드를 보고 이해하는게 빠르다.
s1=input()
s2=input()
dp=[[0]*(len(s2)+1) for _ in range(len(s1)+1)]
for row in range(1,len(s1)+1):
for col in range(1,len(s2)+1):
if s1[row-1]==s2[col-1]:
dp[row][col]=dp[row-1][col-1]+1
else:
dp[row][col]=max(dp[row-1][col],dp[row][col-1])
print(dp[-1][-1])
먼저
1번 의문점.
왜 dp리스트 앞에 0을 붙여주는가.
이건 else문 땜에 그런거였다. 왼쪽(col-1)과 위쪽(row-1) 중 큰 값을 가져오는데, 0을 붙이지 않은 경우 list 인덱스에러가 날 수 있기 때문에 각 리스트앞쪽에 패딩(앞에 0을 붙여줌)해준 것이다.
2번 의문점.
왜 if문에 i-1, j-1이 들어가는가? 비교할려면 i,j여야 되지 않나?
매우 간단했다. 우리가 dp에는 앞에 0을 붙였지만, s1과 s2에는 공백이나 0을 붙여주지 않았기 때문이다.
나머지 왜 dp[row-1][col-1]에 +1을 해주냐와 왼쪽과 위쪽 중 max값을 넣어줘야하는가는 위의 링크를 통해 이해했다.
'알고리즘' 카테고리의 다른 글
[백준 1931번] 회의실 배정 in python (0) | 2021.11.09 |
---|---|
[백준 12865번] 평범한 배낭(knapsack) in python (0) | 2021.11.09 |
[백준 2565번] 전깃줄 in python (0) | 2021.11.08 |
[백준 10844번] 쉬운 계단 수 in python (0) | 2021.11.05 |
[백준 1149번] RGB 거리 in python (0) | 2021.11.05 |
댓글