언어 자료구조 알고리즘/디딤돌 알고리즘 (C언어)

[C언어 알고리즘] 7.1 거스름 돈 알고리즘

언제나휴일 2016. 12. 2. 21:16
반응형

[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 거스름 돈 알고리즘 소스 코드


반응형