Post

백준 11047번, 동전 0

백준 11047번 c++ 문제풀이


문제:

준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.

동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

풀이:

  1. 일단 문제의 조건에서 동전의 종류가 이전의 주어진 동전 가치의 배수라는 조건이 있다. 최솟값을 구하는데 이런 조건이 있다면 greedy 문제라는 것을 알 수 있다.
  2. greedy 알고리즘은 매순간 최선의 선택을 하는 것, 이 알고리즘이 적용되려면 순간의 최선의 선택이 결과적으로 최선의 선택이 되는지를 알아야 한다.
  3. 벡터(v)에 동전의 종류를 오름차순으로 정렬.
  4. 반복문을 통해 v[i]가 k보다 작다면 result+=k/v[i], 이런 식으로 구해야하는 동전의 개수를 업데이트.
  5. k는 v[i]로 나눈 나머지 값으로 업데이트.
  6. v[i] > k 일때는 사용되지 않는 동전이므로 cointinu.
  7. 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.