본문 바로가기

BOJ(백준 문제풀이)

백준 5585 거스름돈 solution[python, 파이썬] - 풀이, 설명::FBTT

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

 

5585번: 거스름돈

문제 타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사고 카운터에서 1000엔 지폐를 한장 냈을 때, 받을 잔돈에 포함된 잔돈의 개수를 구하는 프로그램을 작성하시오. 예를 들어 입력된 예1의 경우에는 아래 그림에서 처럼 4개를 출력해야 한다. 입력 입력은 한줄로 이루어져있고, 타로가 지불할

www.acmicpc.net

문제
입출력

이번 문제는 이전에 풀었던 문제와 매우 비슷합니다.

 

바로 설탕 배달 문제입니다.

https://readytoearndon.tistory.com/18?category=835376

 

백준 2839 설탕 배달 solution[python] - 풀이, 설명::FBTT

https://www.acmicpc.net/problem/2839 2839번: 설탕 배달 문제 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는..

readytoearndon.tistory.com

 

설탕 배달 문제는 배달해야 할 설탕의 무게가 입력되면 3kg 설탕과 5kg 설탕으로 그 무게를 만들어 설탕 봉지의 개수를 출력하는 문제였습니다. 단, 봉지의 개수를 최소한으로 만들어야 했죠.

 

이번 거스름돈 문제도 지불해야 할 돈이 입력되면 1000엔에서 입력된 돈을 빼서 거스름돈이 얼마인지를 알아냅니다.

 

그런 다음 500, 100, 50, 10, 5, 1엔 짜리의 잔돈으로 거스름돈의 개수를 출력하면 됩니다.

 

단, 이번 경우에도 잔돈의 개수를 최소한으로 해야하죠.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
= int(input())
change = 1000 - N
cnt_1 = 0
cnt_5 = 0
cnt_10 = 0
cnt_50 = 0
cnt_100 = 0
cnt_500 = 0
if change >= 500:
    cnt_500 = change // 500
    change = change - cnt_500 * 500
if change >= 100:
    cnt_100 = change // 100
    change = change - cnt_100 * 100
if change >= 50:
    cnt_50 = change // 50
    change = change - cnt_50 * 50
if change >= 10:
    cnt_10 = change // 10
    change = change - cnt_10 * 10
if change >= 5:
    cnt_5 = change // 5
    change = change - cnt_5 * 5
if change < 5:
    cnt_1 = change
print(cnt_1 + cnt_5 + cnt_10 + cnt_50 + cnt_100 + cnt_500)
cs

(cnt_잔돈)은 해당 잔돈의 개수를 나타냅니다. 받아야 할 잔돈이 잔돈의 단위보다 크다면 그 잔돈으로 받는 것이 가장 적은 개수로 잔돈을 받을 수 있습니다.

 

그래서 큰 수 부터 확인해줍니다.

 

그런데 이 방법의 코드는 지저분해 보입니다.

 

그래서 코드를 단순하게 바꿀 순 없을까 생각해봐야 합니다. 저 많은 if문들을 하나의 반복문으로 바꿀 수 있다면 코드의 길이가 많이 줄어들 겁니다.

 

그리고 여러 개로 나뉘어져 있는 잔돈을 세는 변수를 하나로 만들어 주는 것 또한 필요해 보입니다.

 

굳이 여러개로 나누어 셀 필요가 없어보이니까요.

 

잔돈의 개수를 세는 변수를 cnt하나로 통합해봅시다.

 

그러면 지금과 같이 잔돈을 계산하는 방식으로는 안됩니다.

 

잔돈에서 (개수 * 단위)를 빼주는 방식이 아닌 모듈러 연산을 통해 계산해 줍시다.

 

그러면 해당 잔돈의 개수가 몇 개가 되든 따로 저장할 필요가 없어졌습니다.(그냥 이전에 개수를 저장하던 변수에 합쳐서 저장해도 무방)

 

알아서 나머지를 통해 잔돈이 계산되니까요.

 

1
2
3
4
5
6
7
= int(input())
change = 1000 - N
cnt = 0
for i in [500100501051]:
    cnt += change // i
    change %= i
print(cnt)
cs

그렇게 해서 간추려진 코드입니다.

 

잔돈의 단위는 리스트를 통해 접근하게 해주었습니다.

 

 

이렇게 문제를 풀어보았습니다. 다음에도 유용한 지식을 가진 글로 돌아오겠습니다.

감사합니다.