문제 해결 단계
탐욕 알고리즘의 특징
탐욕 알고리즘 유형 - 거스름돈
타로는 자주 JOI 잡화접에서 물건을 산다. JOI 잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI 잡화점에서 물건을 사고 카운터에서 1000엔 지폐를 한 장 냈을 때, 받을 잔돈에 포함된 잔돈의 개수를 구하는 프로그램을 작성하시오.
// input: 타로가 지불해야하는 금액
// output: 거슬러 받아야하는 잔돈의 최소 동전 개수
function keepTheChange(input){
//거슬러줘야하는 거스름돈을 선언
let change = 1000 - input
//동전의 수를 카운트하기 위해 count를 선언
let count = 0;
//입력값에 잔돈의 종류가 없기때문에 배열로 선언
const coin = [500, 100, 50, 10, 5, 1]
//거스름돈 개수가 가장 적게 잔돈을 주어야만 하기 때문에, 가장 금액이 큰 잔돈부터 계산을 시작하기 위해 배열 선언시 내림차순으로 선언
for(let i = 0; i < coin.length; i++){
if(change === 0) break; //거스름돈이 0이되는 순간 for문을 멈춤
count += Math.floor(change/coin[i]); //거스름돈과 잔돈을 나눈 몫을 카운팅
change %= Math.floor(coin[i]); //거스름돈을 잔돈으로 나눈 나머지를 재할당합니다.
}
return count
}
greedy Algorithm은 선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫓아 최종적인 해답에 도달하는 방법이라고 학습했습니다. 따라서 해당 로직은 “거스름돈을 가장 큰 잔돈부터 나눠서 0원으로 만든다" 라는 최적의 상황을 쫓게 되는 것입니다.