* LCS = 두 수열에서 가장 긴 공통부분 수열. 즉, 연속적일 필요는 없으나 순서가 일치하는 부분 수열이어야 한다.
- 문제
- 제출
두 문자열에 대해서 Matrix를 그려 생각해보자. (문제에 예시로 나와있는 문자열을 이용함)
두 문자열을 문자를 하나 씩 추가해서 완성한다고 생각했을 때, 각 단계에 대한 LCS의 길이는 아래의 표로 정리할 수 있다.
C | A | P | C | A | K | |
A | 0 | 1 | 1 | 1 | 1 | 1 |
C | 1 | 1 | 1 | 2 | 2 | 2 |
A | 1 | 2 | 2 | 2 | 3 | 3 |
Y | 1 | 2 | 2 | 2 | 3 | 3 |
K | 1 | 2 | 2 | 2 | 3 | 4 |
P | 1 | 2 | 2 | 2 | 3 | 4 |
두 가지 경우로 나누어 생각해야 한다.
1. 마지막에 추가된 문자가 서로 같은 경우
서로 같다면, 공통된 마지막 문자는 LCS에 포함되게 된다. 따라서, LCS의 길이는 두 문자열에 마지막 문자가 추가되기 전 LCS길이에 1을 더한 것임을 알 수 있다.
=> cache[i][j] += cache[i-1][j-1]+1
2. 다른 경우
서로 다르다면, 공통된 마지막 문자는 LCS에 포함될 수 없다. 따라서, 두 문자열에 마지막 문자를 추가하기 전 LCS를 각각 비교하여 더 큰 값과 같아야 함을 알 수 있다.
=> cache[i][j] += max(cache[i-1][j], cache[i][j-1])
import sys
firstSt = str(sys.stdin.readline().strip())
secondSt = str(sys.stdin.readline().strip())
length1 = len(firstSt)
length2 = len(secondSt)
cache = [[0]*(length2+1) for _ in range(length1+1)]
for i in range(1,length1+1):
for j in range(1,length2+1):
if firstSt[i-1] == secondSt[j-1]:
cache[i][j] += cache[i-1][j-1]+1 # 두 문자열에 각 한 자리씩 추가되기 전 LCS + 1
else:
cache[i][j] += max(cache[i-1][j], cache[i][j-1])
print(cache[-1][-1])
처음에는 이 문제를 이해하는 것조차 힘들었다,, 도대체 LCS가 무엇인지...
그래서 사실 이 문제는 구글링을 해서 풀었다고 보면 되는;; ㅠㅠ
문제 이해를 하고 풀어냈다는 점에 만족하자^^
'Study > [파이썬] 백준온라인' 카테고리의 다른 글
[ 백준/python] 2217 : 로프 (0) | 2021.07.30 |
---|---|
[ 백준/python ] 5585 : 거스름돈 (0) | 2021.07.30 |
[백준/python] 10844 : 쉬운 계단 수 (0) | 2021.07.15 |
[백준/python] 2225: 합분해 (0) | 2021.07.14 |
[백준/python] 11399 : ATM (0) | 2021.07.05 |