본문 바로가기

백준

백준 11047: 동전 0

📃 문제: 백준 11047(동전 0)

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

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

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

[입력]

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

 

 

 

🥈 난이도: 실버 4

 

 

 

😲 사용한 개념: 그리디 알고리즘

 

💡 그리디 알고리즘이란?

현재 상태에서 보는 선택지 중 최선의 선택지가 전체 결과에서의 최선의 선택지라고 가정하는 알고리즘이다.

최적해를 구하는 근사적인 방법으로 당장 눈 앞에 있는 최적의 해를 선택해가는 방식으로 진행되기 때문에 탐욕적인(=Greedy) 알고리즘이라고 불린다.

 

수행과정은 아래와 같다.

1) 현재 상태에서의 최선의 해를 선택
2) 해가 전체 문제 제약 조건에 벗어나지 않는지 검사
3) 선택한 해 집합이 전체 문제를 해결할 수 있는지 검사. 아니라면 1로 돌아가 동일 작업을 반복.

 

 

 

📖 풀이 사고 과정

 

 

 

 

👩‍💻 구현 코드(c++ 사용)

#include <iostream>
#include <vector>
using namespace std;

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int N, K, cnt=0;
    cin >> N >> K;
    vector<int> A(N);
    //동전 가치 입력
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }

    //그리디 방식으로 동전개수 cnt
    while (K > 0) {
        cnt = 0;
        for (int i = N-1; i >=0; i--) {
            while (K >= A[i]) {
                K -= A[i];
                cnt++;
            }
        }
    }
    cout << cnt << endl;
    return 0;
}

'백준' 카테고리의 다른 글

백준 1744: 수 묶기  (0) 2024.03.14
백준 1715: 카드 정렬하기  (0) 2024.03.13
백준 1300: K번째 수  (1) 2024.02.17
백준 2805: 나무 자르기  (1) 2024.02.15
백준 1920: 수 찾기  (1) 2024.02.11