1. 선택 절차 (Selection Procedure) : 현재 상태에서의 최적의 해답을 선택
2. 적절성 검사 (Feasibility Check) : 선택된 해가 문제의 조건을 만족하는지 검사
3. 해답 검사 (Solution Check) : 원래의 문제가 해결되었는지 검사하고, 해결되지 않았다면 선택 절차로 돌아가 과정을 반복함
전체 문제의 안에는 여러 단계가 존재하고, 이 여러 단계 내의 하나 하나의 단계에 대해 최적해가 도출되어야 한다

그리디 알고리즘 : 시작 지점부터 가장 큰 수를 얻는 path, 17을 선택
결론적으로 그리디 알고리즘은 시작 - 17 - 23 path가 가장 좋은 것이라고 판단함
→ 이때 6 아래의 128이라는 값이 있어서 Path를 변경할 수 없다
Greedy 알고리즘은 항상 최적의 결과를 도출하는 것은 아니지만, 어느 정도 최적에 근사한 값을 빠르게 도출할 수 있는 장점이 있다.
이 장점으로 인해 Greedy 알고리즘은 근사 알고리즘으로 사용할 수 있다.
Greedy 알고리즘을 적용해도 언제나 최적해를 구할 수 있는 문제(매트로이드)가 있고, 이러한 문제에 Greedy 알고리즘을 사용해서 빠른 계산 속도로 답을 구할 수 있다.
그래서 실용적으로 사용할 수 있다.
// greedy algorithm (거스름 돈 문제)
// 10000 5000 1000 500 100 50 10
function getChange(value) {
let changes = [10000, 5000, 1000, 500, 100, 50, 10];
let won = Math.floor(value / 10) * 10; // 1의 자리 원화 반내림
let i = 0;
let counts = [];
while (true) {
if (won >= changes[i]) {
let count = Math.floor(won / changes[i]);
won = won - changes[i] * count;
counts[i] = count;
} else {
counts[i] = 0;
}
i++;
if (won === 0) {
for (let j = 0; j < changes.length - i; j++) {
counts.push(0);
}
break;
}
}
changes.map((change, index) => {
console.log(`${change.toLocaleString()}원 ${counts[index]}개`);
});
}
getChange(32660);
/*
10,000원 3개
5,000원 0개
1,000원 2개
500원 1개
100원 1개
50원 1개
10원 1개
*/
getChange(1000);
/*
10,000원 0개
5,000원 0개
1,000원 1개
500원 0개
100원 0개
50원 0개
10원 0개
*/
getChange(1500);
/*
10,000원 0개
5,000원 0개
1,000원 1개
500원 1개
100원 0개
50원 0개
10원 0개
*/