[백준/BOJ] 백준 11047번 : 동전 0

2020. 6. 7. 11:44알고리즘 문제풀이

https://www.acmicpc.net/problem/11047

 

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

동전 가치의 합이 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;
}