문제
타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사고 카운터에서 1000엔 지폐를 한장 냈을 때, 받을 잔돈에 포함된 잔돈의 개수를 구하는 프로그램을 작성하시오.
입력
입력은 한줄로 이루어져있고, 타로가 지불할 돈(1 이상 1000미만의 정수) 1개가 쓰여져있다.
출력
제출할 출력 파일은 1행으로만 되어 있다. 잔돈에 포함된 매수를 출력하시오.
출처
Olympiad > Japanese Olympiad in Informatics > Japanese Olympiad in Informatics Qualification Round > JOI 2008 예선 1번
https://www.acmicpc.net/problem/5585
문제풀이
나는 이 문제를 보자마자 그리디 알고리즘이 생각났다.
그리디 알고리즘을 이해하고 있는 분이라면 어렵지 않게 풀 수 있고, 그리디를 알고리즘을 모른다하더라도 그렇게까지 헤멜 문제는 아니라고 생각한다.
이 문제의 핵심은 잔돈의 갯수를 가장 적게 줘야한다는 것이다.
즉, 큰 돈부터 잔돈을 나눠서 준다면 잔돈의 갯수는 줄어든다.
ex) 예제 입력 1 : 380
1000(타로가 지불 할 돈) - 380(결제해야 하는 돈) = 620(거스름 돈)
result = 0
620 - 500(500엔 1장) = 120 // result = 0 + 1 = 1
120 - 100(100엔 1장) = 20 // result = 1 + 1 = 2
※50엔으로는 거스름돈을 줄 수 없다.
20 - 20(10엔 2장) = 0 // result = 2 + 2 = 4
그리디 알고리즘의 핵심은 가장 큰 것부터 '욕심' 내서 해결하는 것이다.
소스코드를 보면서 한번 구현해보길 바란다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
coin_list = [500, 100 , 50 ,10 , 5 , 1]
pay = int(input())
pay_re = 1000 - pay
result = 0
i = 0
while True :
if coin_list[i] <= pay_re :
result += (pay_re // coin_list[i])
pay_re = (pay_re % coin_list[i])
if pay_re == 0 or i == 5 :
break
i+=1
print(result)
|
cs |
'BaekJoon' 카테고리의 다른 글
[백준 알고리즘] 1065번 : 한수 (JAVA) 문제 풀이 (0) | 2021.08.23 |
---|---|
[백준 알고리즘] 11047번 : 동전 0 (Python) 문제 풀이 (0) | 2021.08.23 |
[백준 알고리즘] 1929번 : 소수구하기 (C) 문제 풀이 (0) | 2021.08.23 |
[백준 알고리즘] 2941번 : 크로아티아 알파벳 (Python) 문제 풀이 (0) | 2021.08.20 |
[백준 알고리즘] 2292번 : 벌집 (JAVA) 문제 풀이 (0) | 2021.08.19 |