그리디는 매 단계 최선을 골라 되돌아보지 않습니다. 동적 계획법은 부분 문제의 답을 저장해 두고 다시 씁니다. 갈림길은 하나입니다. 지금의 최선이 전체의 최선을 망치지 않는다고 증명되면 그리디, 아니면 동적 계획법입니다.
무엇이 다른가
| 항목 | 그리디 | 동적 계획법 |
|---|---|---|
| 판단 | 매 단계 그 자리에서 최선 | 부분 문제를 모두 보고 결정 |
| 되돌아보기 | 없다 | 저장한 답을 다시 쓴다 |
| 성립 조건 | 지금의 최선이 전체 최선을 깨지 않음 | 중복 부분 문제가 있고 부분의 최적이 전체의 최적을 만든다 |
| 비용 | 대개 정렬 뒤 한 번 훑기 | 상태 수만큼 계산과 저장 |
그리디가 깨지는 예
동전으로 금액을 만드는 문제입니다. 500, 100, 50, 10원처럼 큰 단위가 작은 단위의 배수이면 큰 것부터 집는 그리디가 맞습니다.
그런데 동전이 1원, 3원, 4원이고 6원을 만든다면 그리디는 4원을 먼저 집고 1원 두 개를 더해 세 개를 씁니다. 실제 최선은 3원 두 개로 두 개입니다. 큰 것부터 집는다는 판단이 뒤를 망친 것이고, 이럴 때 동적 계획법으로 넘어갑니다.
동적 계획법이 이득을 내는 지점
같은 부분 문제를 여러 번 계산하는 구조여야 합니다. 피보나치를 그대로 재귀로 풀면 같은 값을 지수적으로 다시 계산합니다. 한 번 구한 값을 저장하면 계산 횟수가 항의 수에 비례하게 줄어듭니다.
반대로 부분 문제가 겹치지 않으면 저장할 이유가 없습니다. 분할 정복이 이 경우이고, 합병 정렬이 그 예입니다.
면접에서 확인하는 것
"그리디가 더 빠르다"는 답만으로는 부족합니다. 빠른 것은 맞지만 틀린 답을 빠르게 낼 수 있다는 것이 요점입니다. 그리디를 골랐다면 왜 성립하는지 말할 수 있어야 하고, 그 설명이 안 되면 동적 계획법이 안전한 선택입니다.