기록 보관소

[Baekjoon/백준] 11047번: 동전 0(C/C++) 본문

코딩 테스트/백준

[Baekjoon/백준] 11047번: 동전 0(C/C++)

JongHoon 2022. 3. 8. 23:06

단계별로 풀어보기 16단계(그리디 알고리즘) 1번 문제

https://www.acmicpc.net/step/33

 

그리디 알고리즘 단계

동전의 조건이 특별해서 동적 프로그래밍보다 빠르게 답을 찾을 수 있는 문제

www.acmicpc.net


백준 11047번: 동전 0

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


문제 설명

준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.


접근 방법

이번 문제는 동전의 종류 N과 동전의 목표 가치 합 K를 입력받고 N개 줄의 가치를 입력받아서, 가치 합이 K가 되는 최소 동전 개수를 출력하는 문제다. 입력받는 가치 값들은 오름차순으로 주어져서 마지막에 입력될수록 큰 값이다.

일단 예제 입력에서 보이듯, 가치가 K보다 훨씬 큰 경우가 있을 수 있다. 이런 경우는 더할 이유가 없으니 모두 빼고 생각해야한다. 그렇게되면 K보다 작은 값들만 남게 되는데 K를 만드는데 필요한 동전의 최솟값을 구해야하므로, 오름차순으로 주어진 값 중 가장 마지막에 입력된 값(배열로 따지면 가장 높은 인덱스)을 K에 빼면된다. 이를 K가 0이 될때까지 반복문을 통해서 반복하면 된다. 그렇게되면 자연스럽게 K 보다 작은 값들 중 가장 큰 값이 먼저 빠지고, 이후 남는 값에 맞춰서 범위 내의 큰 값을 빼게 되어 문제를 해결할 수 있다.


코드

#include <stdio.h>
#define MAX 11

int A[MAX];

int main(int argc, char *argv[]) {
	int N, K, index, count = 0;
	scanf("%d %d", &N, &K);

	for (int i = 0; i < N; i++)
		scanf("%d", &A[i]);

	index = N - 1;
	while (K > 0) {
		if (A[index] > K)
			index--;
		else {
			K = K - A[index];
			count++;
		}
	}

	printf("%d\n", count);

	return 0;
}

결과

백준 제출 결과