백준

[백준_11047번] 동전 0

빙수빈수 2021. 6. 23. 23:11

https://www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

[그리디 알고리즘]

 일명 탐욕 알고리즘이라 불리는 그리디 알고리즘은 '매 번의 선택에서 가장 좋아보이는 선택을 하여 적절한 답을 찾아간다'는 것이다. 이런 그리디 알고리즘은 최적해에 근사하는 방법인 것일뿐 항상 최적해를 만족하는 것이 아니다.

 그리디 알고리즘이 잘 활용 될 수 있는 문제들은 대개 특징이 있는데, 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