Sena's garden

[백준/C언어] 2720번: 세탁소 사장 동혁 본문

백준/C언어

[백준/C언어] 2720번: 세탁소 사장 동혁

paraam02 2024. 8. 19. 22:50

 

문제

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

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

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

심지어 $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)

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

 

 


 

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	int t, c;

	scanf("%d", &t);

	for (int i = 0; i < t; i++) {
		int quarter = 0;
		int dime = 0;
		int nickel = 0;
		int penny = 0;

		scanf("%d", &c);

		if (c / 25 > 0) {
			quarter = c / 25;
			c %= 25;
		}
		if (c / 10 > 0) {
			dime = c / 10;
			c %= 10;
		}
		if (c / 5 > 0) {
			nickel = c / 5;
			c %= 5;
		}
		penny = c;

		printf("%d %d %d %d\n", quarter, dime, nickel, penny);

	}

	return 0;
}

 

 

 


 

 

이 문제는 간단하게 해결할 수 있다. 처음 반복할 횟수 t를 입력받은 후 for문을 t번 반복한다. 모든 동전의 갯수는 0으로 시작되어야 하기 때문에 quater, dime, nickel, penny는 for문 안에 지역변수로 초기화한다. 거스름돈으로 줘야하는 값 c를 입력받으면 가장 큰 단위의 동전부터 차례대로 if문의 조건으로 활용한다. 거스름돈이 25로 나눈 값보다 클 경우 25로 나눈 몫을 quater에 저장해준 후 25로 나눈 나머지를 새로운 거스름돈 c로 초기화한다. 이와 같은 과정을 10, 5로 똑같이 반복한다. 마지막 penny의 경우 앞에서 이미 큰 단위들로 걸렀기 때문에 if문을 반복할 필요없이 남은 c의 값이 곧 penny가 된다. 여기서 if~else if~else문의 구조가 아닌 if문의 반복으로 나타낸 이유는 손님이 받는 동전이 최소한의 갯수여야 한다는 문제의 조건에 의해  거스름돈 c가 모든 과정을 거쳐야만 하기 때문이다. 이렇게 저장된 각 동전들의 갯수를 printf로 출력하여 주어진 거스름돈에 대한 각 동전들의 갯수를 알 수 있다.