문제 풀이

[BOJ] 11047 | 동전 0

문제

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

풀이

문제를 읽어보면, “A_1 = 1, i ≥ 2인 경우에 A_i는 A_{i-1}의 배수”라는 조건이 있는데,

첫번째 조건을 통해, “만들지 못하는 경우는 없다.”를 추측해낼 수 있고,

두번째 조건을 통해, “tA_{i-1}는 A_i로 대체할 수 있다.”를 추측해낼 수 있다. (t는 임의의 상수)

가치가 A_i인 동전을 가치가 A_{i-1}동전으로 대체할 수 있으나,

가치가 A_{i-1}를 여러개 쓰는 것 보다, 가치가 A_i인 큰 동전 하나로 바꾸는게 이득이라는 것을 알 수 있다.

이렇게 가장 큰 동전부터 사용하여, greedy한 방법으로 정답을 찾을 수 있다.

시간복잡도는 동전의 개수, 즉 O(N)이다.

소스

#include<iostream>
using namespace std;

int n, k, cnt, coin[11];
int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> k;
	for (int i = 1; i <=n; i++)
		cin >> coin[i];
	while (n) {
		if (coin[n] > k) {
			n--;
			continue;
		}
		cnt += k / coin[n];
		k %= coin[n];
	}
	cout << cnt;
}
← 문제 풀이 글 더 보기