동적 계획법
본문거스름돈을 줄 때 흔히 가장 큰 동전부터 줄 수 있는 만큼 준다. 우리나라 동전(10원, 50원, 100원, 500원)으로는 이 방법이 늘 동전 수를 가장 적게 한다. 그런데 어느 나라에 1원, 4원, 5원짜리 동전만 있다고 하자. 8원을 거슬러 주려면 큰 것부터 고르면 5원 하나와 1원 셋으로 동전 4개가 든다. 그런데 4원 둘이면 2개로 충분하다. 큰 것부터 고르는 방법은 왜 틀릴까? 어떤 금액이든 가장 적은 동전 수를 확실하게 찾는 방법은 무엇일까?
3.5.1욕심쟁이 방법의 함정
지금 당장 가장 좋아 보이는 선택을 거듭하는 방법을 욕심쟁이(탐욕) 알고리즘이라 한다. 빠르고 간단하지만, 지금의 최선이 전체의 최선을 보장하지는 않는다. 동전 {1, 4, 5}로 8원을 만들 때 5원을 먼저 고르면 남은 3원은 1원 셋으로만 채울 수 있다. 처음의 '좋아 보이는' 선택이 남은 문제를 나쁘게 만든 것이다. 확실한 답을 찾으려면 마지막 동전이 1원, 4원, 5원인 경우를 모두 따져 보아야 한다. 마지막 동전이 4원이면 남은 4원을 가장 적게 만드는 문제가 되고, 그 답은 이미 구해 두었을 수 있다.
금액 \(a\)를 만드는 최소 동전 수를 \(d[a]\)라 하면 \(d[0] = 0\)이고 \[d[a] = 1 + \min_{c \le a} d[a - c]\]이다(\(c\)는 동전의 액면). \(a = 1, 2, 3, \dots\)의 순서로 표를 채우면, 각 칸을 계산할 때 필요한 더 작은 금액의 답이 이미 표에 있다. 금액 \(A\)까지 채우는 데 \(A \times (\text{동전 종류 수})\)번 계산한다.
그림 1에서 금액을 바꾸어 보자. 8원은 동적 계획법으로 4원 둘, 곧 2개이고 욕심쟁이 방법은 4개이다. 12원은 4원 셋으로 3개인데 욕심쟁이 방법은 5 + 5 + 1 + 1로 4개이다. 주황 점이 찍힌 금액마다 욕심쟁이 방법이 틀린다. 동적 계획법은 표를 한 칸씩 채우기만 하면 어떤 금액이든 확실한 최솟값을 준다. 한 번 구한 작은 금액의 답을 표에 적어 두고 다시 쓰기 때문에, 같은 계산을 되풀이하지 않는다.1
3.5.2동적 계획법을 쓰는 조건
동적 계획법은 두 조건이 맞을 때 쓴다. 첫째, 큰 문제의 최적해가 작은 문제의 최적해로 이루어져야 한다. 8원을 가장 적게 만드는 방법에서 마지막 동전을 빼면, 남은 금액도 가장 적은 방법이어야 한다. 이것을 최적 부분 구조라 한다. 둘째, 같은 작은 문제가 여러 번 쓰여야 한다. 3원을 만드는 방법은 7원, 8원, 4원을 만들 때 모두 쓰인다. 이것을 중복 부분 문제라 한다. 두 조건이 맞으면, 작은 문제부터 표를 채우는 상향식이나 재귀에 표를 더한 메모이제이션으로 지수적인 계산을 선형으로 줄일 수 있다.
3.5.3예제 풀이
동전 1원, 4원, 5원으로 13원을 만드는 최소 동전 수를 동적 계획법으로 구하여라. 그림 2의 표에 9원부터 13원까지를 이어 채우고, 욕심쟁이 방법과 비교하여라.
\(d[9] = 1 + \min(d[8], d[5], d[4]) = 1 + 1 = 2\)(5 + 4)이다. \(d[10] = 1 + \min(d[9], d[6], d[5]) = 2\)(5 + 5), \(d[11] = 1 + \min(d[10], d[7], d[6]) = 3\), \(d[12] = 1 + \min(d[11], d[8], d[7]) = 3\)(4 + 4 + 4)이다.
\(d[13] = 1 + \min(d[12], d[9], d[8]) = 1 + 2 = 3\)이고, 5 + 4 + 4가 한 방법이다. 욕심쟁이 방법은 5 + 5 + 1 + 1 + 1로 5개이다. 동적 계획법은 13원까지 표를 채우는 데 13 × 3 = 39번 비교했을 뿐이다. 즉 작은 문제의 답을 표에 모아 두면, 모든 경우를 따지면서도 계산은 금액에 비례할 뿐이다. 그래서 동적 계획법은 최단 경로, 가방 문제, 문자열 비교 같은 많은 최적화 문제의 기본 도구이다.
아래 탐구 카드에서 계단 오르기와 거스름돈 문제를 메모이제이션과 표 채우기로 풀어 보고, 실행 시간을 비교해 보자.
- 동적 계획법이라는 이름은 1950년대 벨먼이 지었다. 그는 연구비를 주는 기관이 '수학 연구'를 싫어해서 일부러 그럴듯한 이름을 골랐다고 회고했다. 여기서 '계획'은 표를 채워 결정을 정한다는 뜻이다.
지금 가장 좋아 보이는 선택을 거듭하는 욕심쟁이 방법은 빠르지만 전체의 최선을 보장하지 않는다. 동적 계획법은 최적 부분 구조와 중복 부분 문제가 있을 때, 작은 문제의 답을 표에 채워 두고 다시 써서 모든 경우를 따지면서도 계산을 크게 줄인다. 그래서 처음 질문의 동전 {1, 4, 5}에서는 큰 동전부터 고르면 8원에 4개가 들지만, 표를 채우는 동적 계획법은 4원 둘로 2개라는 확실한 답을 찾는다.