본문 바로가기

온라인 코딩/그리디(Greedy)

[백준] 11047번 동전 0

 

 

문제

소스코드

 

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
#include<iostream>
#include<vector>
 
int main() {
    int N{}, K{};
    std::cin >> N >> K;
 
    std::vector<int>coins;
 
    for (int i = 0; i < N; ++i) {
        int coin{};
        std::cin >> coin;
        if (coin <= K) //K 이상의 코인값은 받아봐야 의미가 없다.
            coins.emplace_back(coin);
    }
 
    int minSumCount{}, sum{}; 
    auto iter = coins.rbegin(); 
    while (sum != K) {
 
        if (*iter + sum <= K) { //현재 값+sum이 K보다 작다면 덧셈
            sum += *iter;
            minSumCount++;
        }
        else { //아니라면 코인 반복자 이동
            ++iter;
        }
    }
    std::cout << minSumCount << "\n";
}

 

후기

이 문제를 해결하기 위한 방법은 그리디 알고리즘이다.

그리디 알고리즘은 최적해를 구하는 데 사용하는 방법으로 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나아가는 알고리즘이다. 

 

문제는 어렵지 않다. 먼저 N만큼 값을 받아서 coins 컨테이너에 저장을 하는데 이때 나는 어차피 K보다 큰 coin들은 넣어봐야 의미가 없기 때문에 더 크다면 컨테이너에 삽입을 하지 않도록 하였다.

 

그 후 sum값이 K값과 동일할 때까지 반복문을 돈다. 현재 코인 컨테이너의 반복자(가장 높은 숫자)와 sum 값을 더했을 때 K보다 작거나 같다면 그 값을 더하고 그렇지 않다면 그다음 숫자로 이동을 하게 하면서 풀었다.

 

밤을 새고 와서 그런지 비교적 간단한 문제를 골라서 풀었다. 그리디 알고리즘 관련해서 많이 풀어보질 못했기 때문에 좀 더 난이도가 있는 문제도 풀어볼 예정이다.

해결하는데 걸린 시간: 6분

 

출처 및 레퍼런스

문제 링크: 11047번: 동전 0 (acmicpc.net)

 

관련 글

[온라인 코딩/그리디(Greedy)] - [백준] 5585번 거스름돈

[온라인 코딩/그리디(Greedy)] - [프로그래머스] 큰 수 만들기

 

 

'온라인 코딩 > 그리디(Greedy)' 카테고리의 다른 글

[프로그래머스] 큰 수 만들기  (0) 2020.09.28
[백준] 5585번 거스름돈  (0) 2020.05.17