현재 선택이 나중에 미칠 영향에 대해서는 고려하지 않음
항상 최적의 값을 보장하는것이 아니라 최적의 값의 ‘근사한 값’을 목표로 하고 있습니다.
매 순간 가장 좋아 보이는 것을 선택
⭐️ 단순히 현재 상황에서 가장 좋아 보이는 것만을 선택해도 문제를 풀 수 있는지 파악할 수 있어야함
각 단계에서 ‘최선의 선택’을 했을 때 전체 문제에 대한 최적해를 구할 수 있는 경우를 말합니다. 즉, 각 단계에서 가장 이상적인 선택을 하는 것이 전체적으로 최적의 결과를 가져온다는 것입니다.
전체 문제의 최적해가 ‘부분 문제의 최적해로 구성’될 수 있는 경우를 말합니다. 즉, 전체 문제를 작은 부분 문제로 나누어 각각의 부분 문제에서 최적의 해를 구한 후 이를 조합하여 전체 문제의 최적해를 구하는 것을 의미합니다.
-
문제의 최적해 구조 결정
-
문제의 구조에 맞게 선택 절차를 정의 : 선택 절차(Selection Procedure)
- '현재 상태'에서 '최적인 선택'을 함
-
선택 절차에 따라 선택을 수행
-
선택된 해가 문제의 조건을 만족하는지 검사 : 적절성 검사(Feasibility Check)
- '선택한 항목'이 '문제의 조건을 만족'하는지 확인
-
조건을 만족하지 않으면 해당 해를 제외
-
모든 선택이 완료되면 해답을 검사 : 해답 검사(Solution Check)
- '최종 선택'이 '문제의 조건을 만족'시키는지 확인
-
조건을 만족하지 않으면 해답으로 인정되지 않음
💡 예제1 : 거스름돈
손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하라.
'가장 큰 화폐 단위부터' 돈을 거슬러 주는 것
예) 1260원을 거슬러줘야 한다고 하면
500 | 100 | 50 | 10 | 합계 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 1000 |
2 | 2 | 0 | 0 | 1200 |
2 | 2 | 1 | 0 | 1250 |
2 | 2 | 1 | 1 | 1260 |
가지고 있는 동전 중에서 가장 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문
400 + 400이 최적의 해지만 그리디로 가게 되면 500 100 100 100이 되게 된다
N개의 수가 주어지고 그 수를 이용하여 M개의 수에서 제일 큰수 만들기 대신 K번 연속하면 안됨
N : 5 M : 8 K : 3
수 : 2, 4, 5, 4, 6
답 : 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5 = 46
N : 5 M : 7 K : 2
수 : 3, 4, 3, 4, 3
답 : 4 + 4 + 4 + 4 + 4 + 4 + 4 = 28
연속된 수가 아니면 되는거니 제일 큰수와 두번째로 큰수를 빼둔다.
가장 큰 수 : 6 두번째 : 5
6 + 6 + 6 + 5 / 6 + 6 + 6 + 5가 된다 반복되는 수열은 K + 1
따라서 M을 (K+1)로 나눈 몫이 반복 횟수
count = int(m / (k + 1)) * k
count += m % (k+1)
result += count * first
result += (m-count) * second