준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int count = 0;
int coin[] = new int[N];
for(int i=0; i<N; i++)
coin[i] = Integer.parseInt(br.readLine());
for(int i=N-1; i>=0; i--) {
if(coin[i] <= K) {
count += (K / coin[i]);
K %= coin[i];
}
}
System.out.println(count);
}
}
이 문제는 그리디 알고리즘(Greedy Algorithm)을 활용하는 문제이다.
그리디 알고리즘은 매 선택에서 가장 좋아보이는 선택을 하여 적절한 답을 찾아가는 알고리즘이다.
다만 최적해에 근사하는 방법'인 것일뿐 항상 최적해를 만족하는 것이 아니다.
그리디 알고리즘 문제의 특징
1)이전의 선택이 이후의 선택에 영향을 주지 않는다(독립적)
2)전체 최적해가 부분 문제에 대해서도 최적해를 만족한다는 것
장점 :
동적계획법과 달리 최적해를 100% 보장해주진 못하지만 각 순간별 최적 선택을 하기 때문에 근사 해를 구하는 속도가 매우 빠르다.
그래서 동적계획법과 그리디 알고리즘은 서로 상호보완하여 같이 쓰이기도 한다.
그리디 알고리즘을 활용하는 대표적인 문제들
: 거스름 돈 문제나 활동 선택, 최소 신장 트리 문제들이 대표적
이 문제에서 각 동전들은 서로 배수 관계이다.
최소한의 동전을 가지고 목표 가격을 만드려면 당연히 높은 가치의 동전부터 활용하는 것이 이점이 있다. 따라서 가치가 큰 동전부터 차례로 탐색한다.