알고리즘 문제풀이/백준

[백준 6236] 용돈 관리

홍시홍 2020. 4. 24. 01:00

분류 : 이분 탐색

 

요구사항

효율적으로 돈을 사용하기 위한 최소 금액 구하기

 

풀이

아래 문제 요구사항은 인출하는 경우가 m보다 작으면 okay로 해석할 수 있다.

현우는 M이라는 숫자를 좋아하기 때문에, 정확히 M번을 맞추기 위해서 남은 금액이 그날 사용할 금액보다 많더라도 남은 금액은 통장에 집어넣고 다시 K원을 인출할 수 있다.

 

이분 탐색으로

금액을 정해보고 가능하다면 더 작은 금액을 찾아보고(정답 갱신)

불가능 하다면 더 큰 금액을 찾아서 답을 구한다.

 

 

#include <iostream>

using namespace std;
int n,m;
int map[100100];
bool check(int val){
	int money=val;
	int cnt=1;
	for(int i =0 ; i < n ; i++){
		if(map[i]>val){
			return false;
		}
		//현재 가진거 보다 작다면 현재 가진 돈에서 뺀다

		
		if(money >= map[i]){
			money -=map[i];
		}
		else{
			money = val;
			money -=map[i];
			cnt++;
		}
		
		/*
		if(money - map[i] <0){
			money= val;
			cnt++;
		}
		money -= map[i];
		*/
	}
	if(cnt<=m) return true;
	else return false;

}
int main(){
	scanf("%d%d",&n,&m);
	int sum=0;
	for(int i=0 ; i < n ; i++){
		scanf("%d",&map[i]);
		sum+=map[i];
	}
	int low=0;
	int high=sum;
	int ans=0;
	while(low<=high){
		int mid = (low+high)/2;
		//된다면 더 작을걸 찾아야됨
		if(check(mid)){
			ans=mid;
			high = mid - 1;
		}
		//안된다면 큰 거 
		else{
			low = mid + 1;
		}
	}
	cout<<ans<<endl;
}