💡 Safe move
- Greedy choice 중 첫 번째로 선택한 것이 최적의 선택과 일치한 경우
- 지불 금액 5420원을 동전 모음(10원, 50원, 100원, 500원)으로 최소한의 동전 개수로 금액 지불
const cost = 5420;
const coins = [10, 50, 100, 500];
const costCtr = (cost, coins) => {
let coinCount = 0;
// 최소한의 동전갯수를 사용하기 위해 내림차순 정렬
coins.sort((a, b) => b - a);
for(const coin of coins) {
if(coin >= 0) {
const useCoin = Math.floor(cost/coin);
cost -= useCoin * coin;
coinCount += useCoin;
}else {
break;
}
}
return coinCount;
}
const result = costCtr(cost, coins);
console.log(result); // 16
const bagWeight = 15;
// 무게/가치 배열 생성
const items = [
[12, 4],
[2, 2],
[1, 2],
[1, 1],
[4, 10]
]
const getItem = (bagWeight, items) => {
let result = 0;
// 무게별 가치가 큰 순서로 내림 차순
items.sort((a, b) => b[1] / b[0] - a[1] / a[0]);
for (const item of items) {
// 가방 무게 - 아이템무게가 0보다 크거나 같다면 전부 담을 수 있음
if (bagWeight - item[0] >= 0) {
bagWeight -= item[0]; // 담은 무게 만큼 계산
result += item[1]; // 가치 추가
} else {
// 가방에 남은 무게 계산하여 담을 수 있는 무게 측정
const remainder = bagWeight / item[0];
result += remainder * item[1]; // 가치 추가
break; // 더 이상 담지 못함 -> for문을 빠져나옴
}
}
return result;
};
console.log(getItem(bagWeight, items)); // 17.33333..