[C언어 알고리즘] 7.1 거스름 돈 알고리즘
물건을 팔고 가장 적은 개수로 거스름 돈을 주려면 어떻게 해야 할까요? 큰 단위의 돈을 주는 것이 작은 단위로 주는 것보다 유리하겠죠. 탐욕 알고리즘으로 문제를 해결한다면 큰 단위부터 거스름돈을 주게 전개합니다. 큰 단위 화폐부터 작은 단위 화폐 순으로 다음의 알고르즘을 전개합니다. 만약 단위보다 거슬러 줘야 할 돈이 많으면 몇 개를 줄 것인지를 결정합니다. 그리고 남은 돈은 다음 단위 화폐로 넘어가서 계산합니다. 이러한 방법을 계속 수행하면 가장 적은 개수로 거스름 돈을 지불할 수 있습니다.
#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개
[C언어 알고리즘] 7.1.1 거스름 돈 알고리즘 소스 코드
'언어 자료구조 알고리즘 > 디딤돌 알고리즘 (C언어)' 카테고리의 다른 글
[C언어 알고리즘] 7.3.2 프림 알고리즘 구현 (0) | 2016.12.04 |
---|---|
[C언어 알고리즘] 7.3.1 프림 알고리즘에 맞게 그래프 소스 코드 수정 (0) | 2016.12.04 |
[C언어 알고리즘] 7.3 프림(Prim) 알고리즘(최소신장트리 알고리즘) (0) | 2016.12.04 |
[C언어 알고리즘] 7.2 SJF(Shortest Job First) 알고리즘 (0) | 2016.12.04 |
[C언어 알고리즘] 7.1.1 거스름 돈 알고리즘 소스 코드 (0) | 2016.12.02 |
[C언어 알고리즘] 7. 탐욕(Greedy) 알고리즘 (0) | 2016.12.02 |
[C언어 알고리즘] 6.2.8 깊이우선탐색(DFS) 알고리즘 소스 코드 (0) | 2016.12.01 |
[C언어 알고리즘] 6.2.7 깊이우선탐색(DFS) 알고리즘 테스트 코드 작성 (0) | 2016.12.01 |
[C언어 알고리즘] 6.2.6 깊이우선탐색(DFS) 알고리즘의 경험 정보 구현 (0) | 2016.12.01 |
[C언어 알고리즘] 6.2.5 깊이우선탐색(DFS) 알고리즘의 경험(Heuristic) 정보 설계 (0) | 2016.12.01 |