https://www.acmicpc.net/problem/2720
문제
거스름돈의 액수가 주어지면 리암이 줘야할 쿼터(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)
출력
각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.
접근 방법
- 우선 Greedy 문제인 것을 직감적으로 알 수 있다.
입력받은 센트를 쿼터(Quarter,$0.25)로 나눴을 때 몫을 따로 저장하고, 나머지는 다시 피제수(나눠지는 수)가 된다.
그 피제수(나눠지는 수)를 다시 다임(Dime, $0.10)으로 나누고, 몫을 따로 저장하고 나머지는 다시 니켈(Nickel, $0.05)로 나눈다. 마지막으로 페니(Penny, $0.01)로 같은 작업을 반복하여 몫을 LinkedList에 저장하고 출력하면 된다.
정리
1. 쿼터, 다임, 니켈, 페니를 각각 25, 10, 5, 1 센트 단위로 생각하여 num배열을 하나 만든다. 그리고 몇 번 반복할지 T 값을 받는다.
2. 접근 방법에 해당하는 알고리즘을 구현한다.
3. Iterator를 사용하여 LinkedList의 원소를 출력한다.
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int[] num = {25, 10, 5, 1};
int T = sc.nextInt();
// // 1. LinkedList를 T 크기 만큼 만든다.
LinkedList<Integer> arr = new LinkedList<>();
for (int i = 0; i < T; i++) {
arr.add(sc.nextInt());
}
// 2. for문으로 각 값의 몫과 나머지를 구한다
for (int i = 0; i < arr.size(); i++) {
LinkedList<Integer> li = new LinkedList<>();
for (int j = 0; j < num.length; j++) {
// 몫 추가
li.add(arr.get(i) / num[j]);
// 나머지 처리
arr.add(i, arr.get(i) % num[j]);
arr.remove(i + 1);
}
Iterator<Integer> it = li.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
System.out.println();
}
}
}
회고
- 해당 코드에서 핵심은 몫과 나머지를 어떻게 처리하냐의 문제이다. 반복 횟수가 많지는 않은데, ArrayList와 LinkedList 중 어떤 것을 써야 더 효율적일까를 고민해보았고, 물리적으로 비연속적인 LinkedList가 삽입/삭제에 더 유리하기 때문에 LinkedList를 채택했다. 사실 ArrayList를 써도 되지만, 각각의 특징을 공부하고 나니까 간단한 문제에도 이렇게 고민을 하게 되는 것 같다.
그리고, List형태를 출력할 때 for each문 보다 Iterator를 쓰는게 효율적이라는 것을 알게 되었다. for each문은 Map클래스를 출력할 때 용이하다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
백준 (10811) - 바구니 뒤집기 Java (0) | 2023.09.08 |
---|---|
백준(5597) - 과제 안 내신 분? Java (1) | 2023.09.07 |
[Java] Arrays.sort 사용하여 오름차순 정리 및 int 출력 (0) | 2023.06.27 |
[Java] 랜덤한 주사위 수 예측하기 (0) | 2023.06.20 |
백준 2562번 :: 최댓값 - JAVA (0) | 2021.10.01 |