일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스탭퍼
- 프로젝트
- 영어원서읽기
- Daily Challenge
- 괜찮음
- 링피트
- 3줄정리
- 화상영어
- 만화도
- 사이드
- 쓰릴오브파이트
- 읽기
- 개발자
- Writing
- English
- 뭐든
- 30분
- 미드시청
- realclass
- 잡생각
- leetcode
- FIT XR
- 10분
- 운동
- 매일
- 리얼 클래스
- 영어공부
- Problem Solving
- 파비최
- 월간
- Today
- Total
파비의 매일매일 공부기록
DP 정복 - 4.1 세 방법을 차례대로 적용하며 문제 풀기 본문
다이내믹 프로그래밍도 결국 문제를 푸는 기술.
이 기술을 잘 활용하려면 많은 문제를 풀어 봐야 함.
다이내믹 프로그래밍을 사용해 문제를 푸는 기본적인 순서
1. 재귀 호출을 사용해 풀이법 작성
2. 문제의 난이도와 문제를 해결하는데 주어진 시간에 따라 다이내믹 프로그램이나 메모 전략을 사용해 풀이법을 개선
이번 절에서는 재귀, 메모 전략, 다이내믹 프로그래밍의 세 가지 접근 방법을 이용해서 문제를 풀어본다.
예제는 '행렬에서 최소 이동 비용 구하기'다.
0,0에서 n, m에 도달하는데 드는 최소 비용을 구하면 된다.
단, 아래쪽 혹은 오른쪽으로 한 칸씩만 이동 가능하다.
- 재귀로 풀어보자(0,0에서 2,3으로 갈 때)
1. 큰 문제와 작은 문제로 분할.
= 큰 문제 : 셀(2,3)에 도달하는 최소 이동 비용 구하기
= 작은 문제 1 : 셀(2,2)에 도달하는 최소 이동 비용 구하기
= 작은 문제 2 : 셀(1,3)에 도달하는 최소 이동 비용 구하기
2. 수식으로 정의
= 셀(2,3)까지의 최소 이동 비용 : MIN(x, y) + cost [2][3]
3. 종료 조건 정의
= m과 n 모두 0인 경우 : 출발지가 목적지인 경우. cost [0][0]
= m은 0이고 n은 0이 아닌 경우 : 목적지가 최상단 행에 있지만 셀(0, 0)은 아닌 경우. 오른쪽으로만 이동해야 도달 가능. 바로 왼쪽 셀의 최소 이동 비용에 현재 셀의 비용의 더해서 반환
= m은 0이 아니고 n은 0인 경우 : 위에 상태의 반대. 목적지가 최하단 왼쪽 열에 있으나 셀(0, 0)은 아닌 경우. 아래쪽으로만 이동해야 도달 가능. 바로 위쪽 셀의 최소 이동 비용에 현재 셀의 비용을 더해서 반환.
상기의 조건을 이용해서 재귀 함수로 구현했다면 이제 메모 전략을 적용한다.
(재귀 함수로 구현 시, 이미 호출했던 호출이 자주 호출됨)
- 메모 전략
= 각 셀(i, j)의 minPathCost를 처음 계산할 때 이를 일종의 캐시(2차원 배열)에 저장해둔 후 셀(i, j)의 minPathCost 값이 다시 필요하게 되면 계산을 반복하지 않고 캐시에서 가져오는 방법. 각 셀의 최소 이동 비용을 저장해야 하므로 2차원 배열을 캐시에 사용.
= 전역 변수를 이용하면 행렬이 여러 개 있거나 다른 함수들에서 minPathCost를 호출하는 경우가 있다면 전역 변수를 초기화해야 하는 불편함이 있음을 유의. 그러나 보통 PS를 위해서는 전역 변수가 용이함.
- 다이내믹 프로그래밍 적용(상향식)
= 핵심은 0, 0 기준으로 가로로만 진행하는 값(누적 값)을 구하고, 또 세로로만 진행하는 값(누적 값)을 구해서 저장해놓고 계산하는 방법을 따르면 된다.
막상 조각조각 내면서 따져보니 생각보다 그렇게 막연하지는 않은 듯하다.
다음에 문제를 풀 때는 상기의 3개의 순서를 따라가면서 풀면 괜찮을 것 같다.
'Study > Algorithm 문제풀이' 카테고리의 다른 글
DP 정복 - 4.2 다이내믹 프로그래밍을 사용한 문제 해결 : 예제 풀기 1 (0) | 2021.08.29 |
---|---|
DP 정복 - 4.2 다이내믹 프로그래밍을 사용한 문제 해결 (0) | 2021.08.28 |
DP 정복 - 3.2 하향식 접근 방법과 상향식 접근 방법 (0) | 2021.08.26 |
DP 정복 - 3.1 다이내믹 프로그래밍이란? (0) | 2021.08.25 |
DP 정복 - 2.3 메모 전략 (0) | 2021.08.24 |