https://www.acmicpc.net/problem/11047
[그리디 알고리즘]
일명 탐욕 알고리즘이라 불리는 그리디 알고리즘은 '매 번의 선택에서 가장 좋아보이는 선택을 하여 적절한 답을 찾아간다'는 것이다. 이런 그리디 알고리즘은 최적해에 근사하는 방법인 것일뿐 항상 최적해를 만족하는 것이 아니다.
그리디 알고리즘이 잘 활용 될 수 있는 문제들은 대개 특징이 있는데, 1)이전의 탐욕 선택이 이후의 선택에 영향을 주지 않는다(독립적)는 점과 2)전체 최적해가 부분 문제에 대해서도 최적해를 만족한다는 것이다.
[문제]
준규가 가지고 있는 동전은 총 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의 배수)
[코드]
import java.util.*;
public class BaekJoon_11047 {
public static int n,k,result=0;
public static Integer[] coin;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
k=sc.nextInt();
coin=new Integer[n];
for(int i=0;i<n;i++)
coin[i]=sc.nextInt();
// 화폐 단위가 큰 것 부터 검사하기 위해 내림차순 정렬
Arrays.sort(coin,Collections.reverseOrder());
for(int i=0;i<n;i++) {
// 현재 동전이 k보다 작거나 같은 경우
if(coin[i]<=k) {
// 현재 동전으로 구성할 수 있는 개수를 더해준다.
result+=k/coin[i];
// k값 조정
k=k%coin[i];
}
}
System.out.println(result);
}
}
[고찰]
위의 문제에서 각 동전들은 서로 배수 관계인 것을 볼 수 있다. 이렇게 배수관계에 놓여있을 경우 대표적으로 그리디 알고리즘으로 풀리는 문제가 바로 이번 문제와 같은 것들이다. 동전이 입력 받은 금액보다 작은 경우에는 해당 동전으로 구성할 수 있는 개수만큼 더해주는 방식으로 구성하면 쉽게 해결할 수 있다.
'백준' 카테고리의 다른 글
[백준_1463번] 1로 만들기 (0) | 2021.06.24 |
---|---|
[백준_11399번] ATM (0) | 2021.06.23 |
[백준_2579번] 계단 오르기 (0) | 2021.06.22 |
[백준_1932번] 정수 삼각형 (0) | 2021.06.22 |
[백준_1149번] RGB거리 (0) | 2021.06.22 |