설명
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
출력
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
예시 입력1
10 4200
1
5
10
50
100
500
1000
5000
10000
50000
예시 출력1
6
예시 입력2
10 4790
1
5
10
50
100
500
1000
5000
10000
50000
예시 출력2
12
풀이
[입력]
입력받은 Ai(동전의 가치)가 K(가치의 합)보다 작거나 같으면 ArrayList에 값을 추가한다.
[로직]
입력받을 때 ArrayList에 이미 오름차순으로 입력을 받았다. 내림차순으로 정렬하여 가치가 큰 동전부터 사용하도록 한다. Collections.reverse()를 사용한다.
동전의 개수를 세는 int형 변수 answer를 0으로, ArrayList의 인덱스를 나타내는 int형 변수 index를 0으로 초기화 한다.
현재 인덱스의 금액을 나타내는 int형 변수 current는 ArrayList의 현재 index 값으로 초기화 한다.
잔액이 0이 될 때 까지 아래 로직을 반복한다.
만약 잔액(remain)이 현재 동전의 값(current) 보다 작다면 index를 1 증가시킨다.
그렇지 않으면 잔액(remain)에서 현재 동전의 값(current)를 빼고, 동전의 개수(answer)를 1 증가시킨다.
코드
package baekjoon._11047;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static int solution(ArrayList<Integer> arr, int remain) {
Collections.reverse(arr);
int answer = 0;
int index = 0;
int current = arr.get(index);
while (remain != 0) {
if (remain < current) {
index++;
current = arr.get(index);
}
else {
remain -= current;
answer++;
}
}
return answer;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
ArrayList<Integer> arr = new ArrayList<>();
for(int i = 0; i < N; i++) {
int A = Integer.parseInt(br.readLine());
if (A <= K) { // 여기 주의!!
arr.add(A);
}
}
bw.write(sb.append(solution(arr, K)).toString());
bw.flush();
bw.close();
br.close();
}
}
'Baekjoon' 카테고리의 다른 글
[백준/자바] 14916번 거스름돈 (0) | 2024.03.27 |
---|---|
[백준/자바] 1946번 신입 사원 (1) | 2024.03.26 |
[백준/자바] 1439번 뒤집기 (0) | 2024.03.26 |
[백준/자바] 1026번 보물 (1) | 2024.03.24 |
[백준/자바] 20115번 에너지 드링크 (0) | 2024.03.21 |