백준 11047번, 동전 0
백준 11047번 c++ 문제풀이
문제:
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
풀이:
- 일단 문제의 조건에서 동전의 종류가 이전의 주어진 동전 가치의 배수라는 조건이 있다. 최솟값을 구하는데 이런 조건이 있다면 greedy 문제라는 것을 알 수 있다.
- greedy 알고리즘은 매순간 최선의 선택을 하는 것, 이 알고리즘이 적용되려면 순간의 최선의 선택이 결과적으로 최선의 선택이 되는지를 알아야 한다.
- 벡터(v)에 동전의 종류를 오름차순으로 정렬.
- 반복문을 통해 v[i]가 k보다 작다면 result+=k/v[i], 이런 식으로 구해야하는 동전의 개수를 업데이트.
- k는 v[i]로 나눈 나머지 값으로 업데이트.
- v[i] > k 일때는 사용되지 않는 동전이므로 cointinu.
- k=0이 되면 stop.
코드:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(void){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<int> v;
int result = 0;
for(int i=0;i<n;i++){
int input;
cin >> input;
v.push_back(input);
}
for(int i=v.size()-1;i>=0;i--){
if(v[i] > k){
continue;
}
else if(v[i] <= k){
result += k/v[i];
k = k%v[i];
}
if(k == 0){
break;
}
}
cout << result;
return 0;
}
감사합니다.
This post is licensed under CC BY 4.0 by the author.