물건을 팔고 가장 적은 개수로 거스름 돈을 주려면 어떻게 해야 할까요? 큰 단위의 돈을 주는 것이 작은 단위로 주는 것보다 유리하겠죠. 탐욕 알고리즘으로 문제를 해결한다면 큰 단위부터 거스름돈을 주게 전개합니다. 큰 단위 화폐부터 작은 단위 화폐 순으로 다음의 알고르즘을 전개합니다. 만약 단위보다 거슬러 줘야 할 돈이 많으면 몇 개를 줄 것인지를 결정합니다. 그리고 남은 돈은 다음 단위 화폐로 넘어가서 계산합니다. 이러한 방법을 계속 수행하면 가장 적은 개수로 거스름 돈을 지불할 수 있습니다.
#include <stdio.h>
먼저 화폐 단위를 열거형으로 정의합시다.
typedef enum _MType MType; enum _MType { One=1, Five=5, Ten=10, Fifty=50,Hun=100, FHun=500, Thous=1000,FTh=5000, TenTh=10000, FTenTh=50000 };
다음은 지불한 화폐와 구입한 물건의 가격을 입력받아 지불할 거스름 돈을 결정하는 함수입니다.
void Calculate(MType money,int value) {
지불해야 할 거스름 돈을 계산합니다.
int remain = money - value; int ftenth=0,tenth=0, fth=0, thous=0; int fhun=0,hun=0, fifty=0, ten=0, five=0, one=0; printf("가격:%d, 받은 돈:%d\n",money,value); printf("=== 거스름 돈 ===\n");
가장 큰 단위인 오만원보다 크면 오만원 권을 몇 개를 주어야 하는지 계산합니다.
if(remain>FTenTh) { ftenth = remain/FTenTh; remain = remain % FTenTh; printf("5만원권:%d개\n",ftenth); }
다음 단위인 만원보다 크면 만원 권을 몇 개를 주어야 하는지 계산합니다. 이를 반복합니다.
if(remain>TenTh) { tenth = remain/TenTh; remain = remain%TenTh; printf("만원권:%d개\n",tenth); } if(remain>FTh) { fth = remain/FTh; remain = remain%FTh; printf("5천원권:%d개\n",fth); } if(remain>Thous) { thous = remain/Thous; remain = remain%Thous; printf("천원권:%d개\n",thous); } if(remain>FHun) { fhun = remain/FHun; remain = remain%FHun; printf("오백원권:%d개\n",fhun); } if(remain>Hun) { hun = remain/Hun; remain = remain%Hun; printf("백원권:%d개\n",hun); } if(remain>Fifty) { fifty = remain/Fifty; remain = remain%Fifty; printf("오십원권:%d개\n",fifty); } if(remain>Ten) { ten = remain/Ten; remain = remain%Ten; printf("십원권:%d개\n",ten); } if(remain>Five) { five = remain/Five; remain = remain%Five; printf("오원권:%d개\n",five); } if(remain>One) { one = remain/One; remain = remain%One; printf("일원권:%d개\n",one); } }
이와 같은 알고리즘으로 문제를 해결하면 최소 개수로 잔돈을 지불할 수 있습니다.
int main() { Calculate(TenTh,1352); return 0; }
▷ 실행 결과
가격:10000, 받은 돈:1352 === 거스름돈 === 5천원권:1개 천원권:3개 오백원권:1개 백원권:1개 십원권:4개 오원권:1개 일원권:3개