📃 문제: 백준 11047(동전 0)
준규가 가지고 있는 동전은 총 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 |