일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 프로젝트
- 파비최
- 스탭퍼
- 화상영어
- 괜찮음
- 월간
- 리얼 클래스
- 30분
- 미드시청
- 링피트
- 쓰릴오브파이트
- 뭐든
- leetcode
- 매일
- 사이드
- Writing
- Problem Solving
- 잡생각
- FIT XR
- 10분
- 만화도
- English
- 영어공부
- 운동
- 3줄정리
- Daily Challenge
- 영어원서읽기
- 읽기
- 개발자
- realclass
Archives
- Today
- Total
파비의 매일매일 공부기록
5.5 최장 공통 부분 수열 길이 구하기 - DP 본문
LCS의 마지막(이라고 했지만 하나 더 남음) 과정인 DP
캐시 리스트를 하나 만들어서 업데이트하는 방식으로 구현하면 된다.
이전에 했던 소스들과 유사한 부분이 있음.
문자열 a, b의 길이 m, n에 대해서 cache [m+1][n+1]을 만든다.
m+1, n+1인 이유는 두 문자열 모두 빈 문자열인 경우를 추가해야 하기 때문.
각 문자열들을 첫 번째 인덱스부터 순회하면서 비교했을 때 동일하면
(i-1, j-1)의 값에서 +1을 하면 되고
다르다면
(i-1, j)과 (i, j-1) 중 큰 값으로 업데이트를 해주면 된다.
표를 보면 오히려 이해가 쉬운데, 순회하는 방향이 결국엔 문자열이 증가하는 방향이므로 공통된 문자를 count 하는 거라고 볼 수 있다.
위의 내용을 소스로 옮기면 다음과 같다.
def solve(a, b):
m, n = len(a), len(b)
cache = [[0 for __ in range(m + 1)] for _ in range(n + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if a[i - 1] == b[j - 1]:
cache[i][j] = cache[i - 1][j - 1] + 1
else:
cache[i][j] = max(cache[i - 1][j], cache[i][j - 1])
return cache[m][n]
if __name__ == '__main__':
a = input()
b = input()
print(solve(a, b))
예전에 BOJ에 제출했던 소스와 거의 같다. 예전에 제출했을 땐 solve라는 함수를 안 썼었음.
아마 예전에도 구글링 해서 제출했던 거 같은데.. 그리고 유튜브 강의도 봤었던 듯 ㅋㅋㅋㅋ
근데 기억이 안 나는 걸 보면.... 이렇게 포스팅해놔도 나중에 또 까먹지 않을까 싶다 ㅠㅠ
까먹기 전에 반복해서 습관처럼 만드는 게 좋겠지!!
반응형
'Study > Algorithm 문제풀이' 카테고리의 다른 글
5.7 거스름돈 최적화 - 재귀 (0) | 2021.09.16 |
---|---|
5.6 최장 공통 부분 수열 출력하기 (0) | 2021.09.15 |
5.5 최장 공통 부분 수열 길이 구하기 - 메모전략 (0) | 2021.09.13 |
5.5 최장 공통 부분 수열 길이 구하기 - 재귀 (0) | 2021.09.12 |
5.4 부분집합의 합 구하기 - DP (0) | 2021.09.11 |
Comments