> [!date] published: 2022-02-05 [11047번: 동전 0](https://www.acmicpc.net/problem/11047) ## 🌟 문제 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다. 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오. ## 🌟 입력 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 A<sub>i</sub>가 오름차순으로 주어진다. (1 ≤ A<sub>i</sub> ≤ 1,000,000, A<sub>1</sub> = 1, i ≥ 2인 경우에 A<sub>i</sub>는 A<sub>i-1</sub>의 배수) ## 🌟 출력 첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다. ## 🌟 풀이 대충 어떻게 풀어야 할 지 감은 오는데 방법에 확신이 없어서 예시를 넣고. 시뮬레이션을 돌려봤다. ### ✨ 시뮬레이션 동전이 1, 5, 10, 15, 20, 25, 30 이렇게 있고 목표 금액이 100이라고 하자. 1. 100 >= 30 이므로 목표 금액에서 30을 빼본다 -> 남은 금액 70 (사용한 동전 개수 1) 2. 70 >= 30 이므로 목표 금액에서 30을 빼본다. -> 남은 금액 40 (사용한 동전 개수 2) 3. 40 >= 30 이므로 목표 금액에서 30을 빼본다. -> 남은 금액 10 (사용한 동전 개수 3) 4. 10 < 30, 10 < 25, 10 < 20, 10 < 15 이므로 넘어간다. -> 남은 금액 10 (사용한 동전 개수 3) 5. 10 >= 10 이므로 10을 빼본다. -> 남은 금액 0 (사용한 동전 개수 4) 6. 남은 금액이 0이므로 중단하고 사용한 동전 개수를 출력한다. ### ✨ 노트 위 시뮬레이션에 대한 내용을 굳이 재귀로 구현한 이유는 원래 이 문제가 완전탐색(...) 문제인줄 알았기 때문이다. 모든 가능한 조합을 구해서 최솟값을 이용하는 문제인줄 알았는데 일단 그렇게 풀면 함수호출이 너무 많아져서 런타임 에러가 걸리기도 하지만 애초에 그렇게 푸는 문제도 아니었다. 그와중에 효율성을 좀 높이겠다고 (완전탐색에 효율성..?) 내림차순 정렬을 해서 뺄 수 있는대로 다 빼줬는데 완전탐색의 시작부분으로 생각했던 그 부분이 의도치 않게 그리디 알고리즘으로 푼 꼴이 되었다.ㅋㅋ 이 문제에서는 재귀로 푸는 것에 대한 메리트가 별로 없어보여서 그낭 반복문 돌려서 구현하는게 쉽고 이해하기 쉽고 좋을 것 같다...ㅎ ## 🌟 코드 ```cpp /* 2022-2-5 11047_동전 0 https://www.acmicpc.net/problem/11047 */ #include <iostream> #include <vector> #include <algorithm> using namespace std; int N, K, A; vector<int> coins; void coin_coin(int curr_idx, int curr_value, int curr_cnt); int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N >> K; for(int i = 0; i < N; i++){ cin >> A; coins.push_back(A); } sort(coins.begin(), coins.end(), greater<int>()); coin_coin(0, K, 0); return (0); } void coin_coin(int curr_idx, int curr_value, int curr_cnt){ if (curr_value == 0){ cout << curr_cnt; return; } if (coins[curr_idx] > curr_value){ coin_coin(curr_idx + 1, curr_value, curr_cnt); return; } else{ coin_coin(curr_idx, curr_value - coins[curr_idx], curr_cnt + 1); return; } } ```