봄봄.devlog

백준 11047번 :: 동전 0번 (그리디 알고리즘) 본문

Algorithm/백준

백준 11047번 :: 동전 0번 (그리디 알고리즘)

jihyun03 2020. 8. 16. 21:02

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

🎈 문제 풀이

 

현실 세계의 동전과 지폐의 가치는 작은 금액의 지폐의 몇 배수이다.

이 조건이 주어진 경우에, K 금액을 만족하는 동전의 최소수를 계산할 때

큰 동전부터 사용해야 한다.

예) 5만원, 1만원, 5천원, 1천원, 500원, 100원

165200원 = 5만원 + 5만원 + 1만원 + 5천원 + 100원 + 100원

모든 경우의 수를 계산해 볼 필요가 없다.

 

이 조건이 주어지지 않은, 동전 2 문제(2294번)의 경우에는 

큰 동전을 사용하지 않고 작은 동전을 사용하는 경우가 정답일 수도 있다.

예) 10원, 7원, 6원, 3원, 1원 동전이 주어졌을 때 19원이 목표 금액이라면

10원 + 7원 + 1원 + 1원 = 4개

10원 + 6원 + 3원 = 3개

7원을 건너 뛰고, 6원 동전을 사용하는 것이 정답이다.

모든 경우의 수를 계산해 보아야 한다.

 

🎈 소스 코드

 

public class Q11047_1 {
	
	static int[] arr;
	
	static int 최소수(int K) {
		int cnt = 0;
		for(int i=arr.length-1; i>=0; i--) { // 큰 동전부터 사용
			if(K == 0) break;
			if(arr[i] > K) continue;
			cnt += K / arr[i];
			K %= arr[i];
		}
		return cnt;
	}
	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());
		arr= new int[N];
		for(int i=0; i<N; i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		System.out.println(최소수(K));
	}
}

 

🎈 기억할 것

 

그리디 알고리즘 : 어떤 기준으로 항목을 하나씩 선택해 나가는 방식으로 최적의 해를 구하는 방식이다. 

 

'Algorithm > 백준' 카테고리의 다른 글

백준 2667번 :: 단지 번호 붙이기 (DFS) Java  (0) 2020.08.28
백준 7576번 :: 토마토 (BFS)  (0) 2020.08.23
백준 | 1966번 :: 프린터 큐  (0) 2020.08.10
백준 | 10799번 :: 쇠막대기  (0) 2020.08.09
백준 | 10845번 :: 큐  (0) 2020.08.09
Comments