백준 코딩테스트/그리디(Greedy)

2720번: 세탁소 사장 동혁 (8 / 5) - 브론즈 3

monkeykim 2024. 10. 7. 00:42

문제

미국으로 유학간 동혁이는 세탁소를 운영하고 있다. 동혁이는 최근에 아르바이트로 고등학생 리암을 채용했다.

동혁이는 리암에게 실망했다.

리암은 거스름돈을 주는 것을 자꾸 실수한다.

심지어 $0.5달러를 줘야하는 경우에 거스름돈으로 $5달러를 주는것이다!

어쩔수 없이 뛰어난 코딩 실력을 발휘해 리암을 도와주는 프로그램을 작성하려고 하지만, 디아블로를 하느라 코딩할 시간이 없어서 이 문제를 읽고 있는 여러분이 대신 해주어야 한다.

거스름돈의 액수가 주어지면 리암이 줘야할 쿼터(Quarter, $0.25)의 개수, 다임(Dime, $0.10)의 개수, 니켈(Nickel, $0.05)의 개수, 페니(Penny, $0.01)의 개수를 구하는 프로그램을 작성하시오. 거스름돈은 항상 $5.00 이하이고, 손님이 받는 동전의 개수를 최소로 하려고 한다. 예를 들어, $1.24를 거슬러 주어야 한다면, 손님은 4쿼터, 2다임, 0니켈, 4페니를 받게 된다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 거스름돈 C를 나타내는 정수 하나로 이루어져 있다. C의 단위는 센트이다. (1달러 = 100센트) (1<=C<=500)

출력

각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.

예제 입력 1

3
124
25
194

예제 출력 1

4 2 0 4
1 0 0 0
7 1 1 4

코드

import sys

n = int(input())
num_quarter = 0  # 25
num_dime = 0  # 10
num_nickel = 0   # 5
num_penny = 0  # 1

count = []
for i in range(n):
    result_list = []
    cent = int(sys.stdin.readline())  # 124

    num_quarter = cent // 25  # 4
    result_list.append(num_quarter)
    cent = cent % 25  # 24

    num_dime = cent // 10  # 2
    result_list.append(num_dime)
    cent = cent % 10

    num_nickel = cent // 5  # 0
    result_list.append(num_nickel)
    cent = cent % 5  # 4

    num_penny = cent // 1  # 4
    result_list.append(num_penny)
    cent = cent % 1  # 0

    count.append(result_list)

for num in count:
    for j in range(4):
        print(num[j], end=' ')
    print()

코드 풀이

  1. int 타입으로 input을 받는다.
  2. quarter, dime, nickel, penny를 0으로 초기화 한다. 이 변수에는 각 동전 단위의 몫을 담는다.
  3. 가장 큰 수부터 나누며, 몫을 리스트에 담고 나머지는 다음 동전 단위와 나누기 위해 cent에 다시 반환한다.
  4. 예제 출력대로 출력하기 위해 2중 for문을 사용한다.

핵심 포인트

  1. 소수점은 정수로 바꾸어서 생각한다.
    • 0.25는 25로, 0.10은 10으로, 0.05는 5로, 0.01은 1로 생각한다.
  2. 그리디 알고리즘을 사용하여 가장 큰 수인 25부터 1까지 나누어준다.
    • 몫은 list에 담아주고 나머지는 cent에 다시 반환한다.
  3. 예제 출력의 포맷에 맞게 출력하기 위해, 2중 for문을 사용하였으며, 공백을 기준으로 띄어야 하기 때문에 end=’ ‘ 를 사용한다.