백준(C언어) 풀이/그리디(Greedy) 알고리즘

백준(C) 5585번 거스름돈 풀이

개발윗미 2021. 8. 3. 16:57

C로 구현한 5585번 거스름돈 구하기 문제 풀이입니다.

 

https://www.acmicpc.net/problem/5585

 

5585번: 거스름돈

타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사

www.acmicpc.net


#include <stdio.h>

int main() {
	int input, money, result=0;
	scanf("%d", &input);
	money = 1000 - input;
	result += money / 500;
	money %= 500;
	result += money / 100;
	money %= 100;
	result += money / 50;
	money %= 50;
	result += money / 10;
	money %= 10;
	result += money / 5;
	money %= 5;
	result += money / 1;
	
	printf("%d", result);
}

 

우선 문제 조건에 1000엔 지폐를 한장 냈을 때 라는 조건이 걸려있고, 거스름돈을 내어주기 위해 변수 money에 

 

1000엔 - input(지불한 금액) 을 계산하여 저장한다. 그럼 money 변수는 거스름돈 변수에 해당한다.

 

변수 result에 먼저 500을 나눈 몫을 저장한 다음 100을 나눈 몫을 누적시키고, 50을 나눈 몫을 누적시키고, 10을 나눈 몫을

 

누적시키고, 5를 나눈 몫을 누적시키고 마지막으로 1을 나눈 몫을 누적시키면 된다.

 

즉, 만약 380엔을 입력시킨다고 가정한다면 거슬러줘야하는 금액은 1000-380 = 620엔이다.

 

또한 거스름돈에 포함된 매수를 구하는 과정은 아래와 같다.

 

(1) 620에서 500을 나눈 몫은 1이고 나머지 값은 120이다.

 

(2) 120에서 100을 나눈 몫은 1이고 나머지 값은 20이다.

 

(3) 20에서 10을 나눈 몫은 2이고 나머지 값은 0이다.

 

  => 그러므로 총 몫을 누적해나가면 1 + 1 + 2 = 4 라는 결과를 얻을 수 있다.