코딩테스트
[힌트 문제3-5] 그리디
개발하는지호
2023. 10. 6. 17:24
문제
준규가 가지고 있는 동전은 총 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
<<풀이>>
package sec01.hint3_1;
import java.util.Scanner;
public class pjh_greedy {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int K = sc.nextInt();
int[] coin = new int[N];
for (int i = 0; i < N; i++) {
coin[i] = sc.nextInt();
}
int count = 0;
for (int i = N - 1; i >= 0; i--) {
//현재 동전의 가치가 K보다 작거나 같아야지 구성가능하다.
if (coin[i] <= K) {
count += (K / coin[i]);
K = K % coin[i];
}
}
System.out.println(count);
}
}
그리디 알고리즘
말 그대로 greedy(탐욕)이다. 즉, 탐욕 알고리즘이다. 그리디 알고리즘에서 가장 중요한 키워드는 '매 번의 선택에서 가장 좋아보이는 선택을 하여 적절한 답을 찾아간다.' 이다.
이것을 활용하면 최소의 코인 갯수를 얻기 위해서는 코인 가치가 가장 큰 것을 먼저 건드는 것이 좋다.