자 문제가 길다. 차분히 읽기 너무 싫다.
그러니까 동혁 중대장이 세탁소를 운영하다 리암을 채용하고 실망했다.
왜냐면 거스름돈을 자꾸 실수해서 주기 때문. 중대장은 리암을 도와주는 프로그램을 작성하려고 하는데 디아블로를 해야해서 이 문제를 읽고 있는 여러분이 대신 해주어야 이런 시발 이런 쓰잘대기 없는 내용이 문제에 왜 있어!!
자 T와 C 두 정수를 입력받는다. T는 테스트 케이스의 개수이며 C는 거스름돈이다. 동전의 개수를 최소하 하여야 한다.
거스름돈 동전의 단위는 25센트(쿼터), 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
27
28
29
30
31
32
33
34
35
|
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int t = sc.nextInt(); //test case
int c[] = new int[t]; //case만큼 거스름돈 배열 선언
for(int i=0; i<t; i++) {
c[i] = sc.nextInt(); //거슬름돈 입력
}
int[] coin = {25, 10, 5, 1}; //쿼터, 다임, 니켈, 페니
for(int i=0; i<t; i++) {
int res[] = new int[4]; //결과 출력 (0으로 초기화)
for(int j=0; j<coin.length; j++) {
while(c[i] >= coin[j]) {
c[i] -= coin[j];
res[j]++;
}
}
for(int j=0; j<res.length; j++) {
System.out.print(res[j]);
System.out.print(" ");
}
System.out.println();
}
}
}
|
cs |
그렇게 어렵지 않다. 그냥 단순하게 예를들면 우리나라 753원을 가장 적은 동전 갯수로 나누려면 어떻게 해야할까?
바로 500원 하나 100원 두개 50원 하나 1원 세 개 일 것이다. 물론 1원은 사용하지 않지만 그런건 고려하지 않는다.
거스름돈을 가장 큰 동전부터 뺄 수 있을만큼 다 빼고 그 다음 큰 동전으로 가고 가고 분배해주면 끝나는 문제다.
이제 반복하는 것들이 있으니 for문 while문 대충 덕지 덕지 발라주면 된다.
14행 : 동전 단위를 int 배열로 입력했다.
16행 : 테스트 케이스만큼 큰 for문을 돈다.
19행 : 동전 단위만큼 반복해서 21행에서 거스름돈이 동전 단위보다 크면 c[i] -= coin[j] 해서 동전 단위만큼 거스름돈에서 빼주고 res[j]++ 그 동전 단위 위치에 있는 res[] 결과값 배열에 카운트 해준다.
손코딩을 해보자면 아래 처럼 124 는 4 2 0 4 가나온다.
이해가 잘 안갈땐 손코딩을 해보고 규칙을 찾아서 코딩을 하면 편하다.
'프로그래밍 > 백준 알고리즘 코드' 카테고리의 다른 글
[백준] 11005번 JAVA 진법 변환 2 - 일반 수학 1 (0) | 2024.07.31 |
---|---|
[백준] 2745번 JAVA 진법 변환 - 일반 수학 1 (0) | 2024.07.31 |
[백준] 2563번 JAVA 색종이 - 2차원 배열 (1) | 2024.01.26 |
[백준] 10798번 JAVA 세로읽기 - 2차원 배열 (0) | 2024.01.16 |
[백준] 2566번 JAVA 최댓값 - 2차원 배열 (0) | 2024.01.15 |
댓글