예산

예산

2019, Jun 02    
  • https://programmers.co.kr/learn/courses/30/lessons/43237
  • 이분법을 이용하여 예산의 상한 가격을 구하는 문제입니다.
  • 이 문제에서 구해야할 것은 상한 가격 입니다. 따라서 구할 수 있는 상한 가격 중 가장 큰 값을 이분법을 이용하여 구해야 합니다.
  • 아래 코드 중 check 함수를 보면 True가 되는 조건을 확인할 수 있습니다.
#include <vector>
#include <string>
#include <algorithm>>
#include <deque>
#include <iostream>
#include <queue>

using namespace std;

int totalBudget;
vector<int> v;

bool check(int bound) {
	int sum = 0;
	for (int i = 0; i < v.size(); ++i) {
		sum += min(v[i], bound);
	}

	if (sum <= totalBudget) {
		return true;
	}
	else {
		return false;
	}
}

int solution(vector<int> budgets, int M) {
	int answer = 0;
	
	v = budgets;
	totalBudget = M;

	int left = 1;
	int right = *max_element(budgets.begin(), budgets.end());

	while (left <= right) {
		int mid = (left + right) / 2;
		if (check(mid)) {
			answer = max(answer, mid);
			left = mid + 1;
		}
		else {
			right = mid - 1;
		}
	}

	return answer;
}