개념
그리디는 각 단계에서 정한 기준에 따라 하나를 선택하고, 그 선택을 유지하며 답을 만드는 방법입니다. 최적해는 문제에서 요구하는 값을 가장 크게 또는 가장 작게 만드는 답입니다. 그리디를 사용하려면 지금의 선택을 포함하는 최적해가 있다는 근거가 필요합니다.
문제 유형에 따른 선택 기준
| 문제 유형 | 구하는 결과 | 선택·처리 기준 | 확인할 근거 |
|---|---|---|---|
| 구간 선택 | 겹치지 않는 구간의 최대 개수 | 종료 시각이 빠른 순서 | 이후에 고를 구간을 방해하지 않는지 |
| 구간 병합 | 겹치는 구간을 합친 결과 | 시작점이 작은 순서 | 현재 구간이 끝났다고 확정할 수 있는지 |
| 처리 순서 결정 | 완료 시각의 합의 최솟값 | 처리 시간이 짧은 순서 | 인접한 두 작업을 바꿀 때 합이 줄어드는지 |
| 동전 선택 | 목표 금액을 만드는 최소 동전 수 | 큰 금액부터 선택하는 기준 검토 | 동전 단위 사이에 교환이 가능한지 |
유형이 같아도 조건이나 목적이 바뀌면 기준이 달라집니다. 구간의 개수를 최대화하는 문제와 구간마다 주어진 보상의 합을 최대화하는 문제는 구별해야 합니다. 보상이 있다면 늦게 끝나는 구간 하나의 보상이 짧은 구간 여러 개의 보상보다 클 수 있습니다.
동전도 큰 것부터 고르는 방법이 항상 성립하지는 않습니다. 단위가 , , 이고 목표 금액이 이면 큰 동전부터 고를 때 로 개, 으로 만들 때는 개입니다. 반면 , , 처럼 각 단위가 바로 아래 단위의 정수배이면 작은 동전 여러 개를 큰 동전 하나로 바꾸어 개수를 줄일 수 있습니다. 이 경우 큰 단위부터 선택하는 근거가 됩니다.
종료 시각이 빠른 구간 선택
한 장소에서 활동을 겹치지 않게 진행하며 최대한 많이 선택하려고 합니다. 가장 빨리 끝나는 활동을 고르면 다음 활동을 시작할 수 있는 시각을 가장 앞당길 수 있습니다.
종료 시각이 빠른 순서로 정렬한 뒤, 직전에 고른 활동의 종료 시각 이상에서 시작하는 활동을 선택합니다. 선택했다면 마지막 종료 시각을 갱신합니다.
활동이 , , , 이면 종료 시각 순서는 , , , 입니다. 앞의 세 활동은 순서대로 선택할 수 있어 답이 입니다. 시작 시각만 보고 을 먼저 고르면 한 개만 선택하게 됩니다.
첫 선택을 바꾸어도 되는 이유
활동을 최대한 많이 선택한 어떤 최적해를 잡고, 그 첫 활동을 라고 합니다. 전체 활동 중 가장 빨리 끝나는 활동을 라고 하면, 의 종료 시각은 의 종료 시각 이하입니다.
최적해에서 를 로 바꾸어도 이후 활동은 그대로 진행할 수 있습니다. 이후 활동은 원래 가 끝난 뒤 시작하므로, 더 일찍 또는 같은 시각에 끝나는 와도 겹치지 않기 때문입니다. 선택한 개수도 같습니다. 따라서 를 첫 활동으로 포함하는 최적해가 존재합니다.
와 겹치는 활동을 제외하면 남은 문제도 같은 형태입니다. 남은 활동에서 다시 가장 빨리 끝나는 것을 선택하는 과정을 반복할 수 있습니다. 이처럼 최적해의 선택을 그리디의 선택으로 바꿔도 답이 나빠지지 않음을 보이는 방법이 교환 논증입니다.
복잡도
활동 수를 이라고 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 정렬을 포함한 구간 선택 | 입력 저장 | |
| 정렬된 구간 확인 | 추가 공간 |
예제
문제
활동의 시작 시각과 종료 시각이 주어진다. 겹치지 않게 선택할 수 있는 활동의 최대 개수를 구하여라. 앞 활동의 종료 시각에 다음 활동을 시작할 수 있다.
입력
첫째 줄에 활동 수 이 주어진다. 이다.
다음 개 줄에 활동의 시작 시각 와 종료 시각 가 공백을 사이에 두고 주어진다. 이다.
출력
선택할 수 있는 활동의 최대 개수를 출력한다.