복대가리의 개발

[C#] 백준 (알고리즘)/브론즈 문제

[백준 - C#] 2720번 세탁소 사장 동혁

복대가리 2022. 7. 22. 00:17
728x90

문제링크

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

 

2720번: 세탁소 사장 동혁

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

www.acmicpc.net

 

문제

미국으로 유학간 동혁이는 세탁소를 운영하고 있다. 동혁이는 최근에 아르바이트로 고등학생 리암을 채용했다.
동혁이는 리암에게 실망했다.
리암은 거스름돈을 주는 것을 자꾸 실수한다.
심지어 $0.5달러를 줘야하는 경우에 거스름돈으로 $5달러를 주는것이다!
어쩔수 없이 뛰어난 코딩 실력을 발휘해 리암을 도와주는 프로그램을 작성하려고 하지만, 디아블로를 하느라 코딩할 시간이 없어서 이 문제를 읽고 있는 여러분이 대신 해주어야 한다.
거스름돈의 액수가 주어지면 리암이 줘야할 쿼터(Quarter, $0.25)의 개수, 다임(Dime, $0.10)의 개수, 니켈(Nickel, $0.05)의 개수, 페니(Penny, $0.01)의 개수를 구하는 프로그램을 작성하시오. 거스름돈은 항상 $5.00 이하이고, 손님이 받는 동전의 개수를 최소로 하려고 한다. 예를 들어, $1.24를 거슬러 주어야 한다면, 손님은 4쿼터, 2다임, 0니켈, 4페니를 받게 된다.

조건

시간제한 : 1초
메모리 제한 : 128 MB

입력

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

출력

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

 

문제정리

이번 문제도 똑같이 잔돈을 반환하는 그리드 알고리즘입니다.

잔돈의 개수를 적게 받아야 하기 때문에 큰 수부터 파악하며 각 동전의 필요한 개수와 나머지 잔돈을 갱신해주며 계산해주면 될 것 같습니다.

 

몫의 경우 각  필요한 동전의 개수이며 나머지는 남은 잔돈 입니다.

자세한 내용은 코드에 주석처리 하였습니다.

C# 코드

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public enum CentType
{
    Quarter = 0,
    Dime = 1,
    Nickel = 2,
    Penny = 3,
 
    Max = 4
}
 
static void Main(string[] args)
{
    // 2720 수학 그리디 알고리즘 사칙연산
    StreamWriter writer = new StreamWriter(OpenStandardOutput());
    StreamReader reader = new StreamReader(OpenStandardInput());
 
    int T = int.Parse(reader.ReadLine());
    int[] money = new int[(int)CentType.Max] { 251051 };
    int[] count = new int[(int)CentType.Max];
 
    for (int i = 0; i < T; i++)
    {
        int USD = int.Parse(reader.ReadLine());
 
        // 쿼터 개수 반환 + 나머지 반환
        count[(int)CentType.Quarter] = USD / money[(int)CentType.Quarter];
        USD %= money[(int)CentType.Quarter];
 
        // 다임 개수 반환 + 나머지 반환
        count[(int)CentType.Dime] = USD / money[(int)CentType.Dime];
        USD %= money[(int)CentType.Dime];
 
        // 페니 개수 반환 + 나머지 반환
        count[(int)CentType.Nickel] = USD / money[(int)CentType.Nickel];
        USD %= money[(int)CentType.Nickel];
 
        // 나머지 == 페니
        count[(int)CentType.Penny] = USD;
 
        writer.WriteLine($"{count[(int)CentType.Quarter]} {count[(int)CentType.Dime]} " +
            $"{count[(int)CentType.Nickel]} {count[(int)CentType.Penny]}");
    }
 
    writer.Close();
    reader.Close();
}
cs

읽어주셔서 감사합니다 오늘도 즐거운 하루 되세요.

 

728x90