본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[c++] 백준 11047 동전 0

백준 단계별로 풀어보기 [그리디 알고리즘] 동전 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가 되게하는 최소 동전의 개수를 구하는 문제이다. 오름차순으로 동전의 가치값을 입력했고, 최소 개수를 구하기 위해서는 가장 큰 가치값부터 시작해서 k를 채워나가면 된다. 따라서 그리디 알고리즘에 해당하고, k / val[n-1] 을 하여 k를 만들 수 있는 동전 개수 cnt를 가장 가치값이 큰 값부터 몇 개씩 이용 가능한지 구해 합해나갔다.  k -= val[n-1] * c 로 k의 값이 0이 될 때까지 반복문을 돌려 구한다.

 

[코드]

#include <iostream>
#include <algorithm>

int main() {
	int n, k, cnt = 0;
	std::cin >> n >> k;
	int* val = new int[n];
	for (int i = 0; i < n; i++) {
		std::cin >> val[i]; 
	}

	int c;
	while (k != 0) {
		c = k / val[n-1];
		cnt += k / val[n - 1];
		k -= val[n - 1] * c;
		n--;
	}

	std::cout << cnt;

	delete[] val;

	return 0;
}