[백준/BOJ] 백준 11047번 : 동전 0
2020. 6. 7. 11:44ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/11047
동전 가치의 합이 k인 경우에서 동전 개수가 최솟값일 때를 찾는 것이므로
동전의 가치가 k이하인 동전 중 가장 가치가 큰 동전을 선택하고 그 동전을 더하는것을 반복한다.
하지만 반복중 더한 결과가 k를 넘어가면 이전으로 되돌리고, 그 동전보다 가치가 작은 동전중 가치가 가장 큰 동전을 선택하고 이 과정을 다시 반복한다.
가치의 합이 k일 때까지 반복한다. 가치의 합이 k인 경우가 처음 나왔을 때 그때의 동전 개수가 동전 개수의 최솟값이다.
코드
#include <iostream>
#include <vector>
using namespace std;
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int n, k;
vector<int> coin;
int temp;
int point = -1;
int result;
int num = 0;
int sum = 0;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> temp;
coin.push_back(temp);
}
for (int i = 0; i < n; i++)
{
//동전의 가치가 k보다 큰것은 쓰이지 않으므로
//쓰일수 있는 동전중 가장 큰 가치의 동전 위치를 point로 한다.
if (coin[i] > k)
{
point = i - 1;
break;
}
else if (coin[i] == k)
{
point = i;
break;
}
//반복문 마지막인데도 point를 찾지 못한경우
if (i == n - 1)
{
point = i;
}
}
//가치의 합이 k일때까지 반복
while (sum != k)
{
//point위치의 코인을 더한다
sum += coin[point];
num++;
//가치의 합이 k를 넘어가면 이전으로 되돌리고
//더하는 코인을 point위치 아래의 것으로 선택한다.
if (sum > k)
{
sum -= coin[point];
num--;
point--;
}
}
cout << num;
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 5585번 : 거스름돈 (0) | 2020.06.09 |
---|---|
[백준/BOJ] 백준 1931번 : 회의실배정 (0) | 2020.06.08 |
[백준/BOJ] 백준 11399번 : ATM (0) | 2020.06.06 |
[백준/BOJ] 백준 1018번 : 체스판 다시 칠하기 (0) | 2020.06.05 |
[백준/BOJ] 백준 1966번 : 프린터 큐 (0) | 2020.06.05 |