Algorithm
백준 / 11047 / 동전 0
c3epmos
2020. 3. 20. 15:10
문제
준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
입출력 예

해결
정렬을 이용한 그리디 알고리즘으로 해결할 수 있다.
코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.util.Scanner; | |
| public class coin0_greedy { | |
| public static void main(String[] args) { | |
| Scanner sc = new Scanner(System.in); | |
| // 동전 종류 | |
| int n = sc.nextInt(); | |
| // 입력 금액 | |
| int k = sc.nextInt(); | |
| // 사용한 동전 갯수 | |
| int cnt = 0; | |
| // 동전 종류 담을 1차원 배열 (오름차순으로 입력) | |
| int[] arr = new int[n]; | |
| for(int i = 0 ; i < n ; i++) | |
| arr[i] = sc.nextInt(); | |
| // 가장 끝 요소부터 반복 | |
| for(int i = n - 1 ; i >= 0 ; i--) { | |
| while(true) { | |
| // 동전이 입력 금액보다 크면 break | |
| if(k < arr[i]) { | |
| break; | |
| } | |
| // 그게 아니면 가능할 때 까지 이 동전으로 표현 시도 | |
| else { | |
| k = k - arr[i]; | |
| cnt++; | |
| } | |
| } | |
| // 다 표현 되었다면 break | |
| if(k == 0) | |
| break; | |
| } | |
| System.out.println(cnt); | |
| } | |
| } |
느낀점
동전 교환과 같은 문제들은 거의 그리디 알고리즘인 것을 알 수 있다.