Koala - 11기/코딩테스트 준비 스터디

[백준/C++] 6236번 : 용돈관리

_dudu 2023. 8. 6. 21:57

 

 

풀이

  • 최소 금액 K의 범위를 생각해봅시다. K는 각 날짜마다 필요한 금액보다는 크거나 같아야 합니다. 즉, K는 1부터 N * 최대 사용 금액 사이의 값일 수 있다.
  • 이분 탐색을 이용하여 가능한 K 값을 찾습니다. 이때, 이분 탐색의 중간값(mid)을 사용하여 K를 검사한다.
  • 주어진 N일 동안 각 날짜별로 사용할 금액을 순회하면서 현재 인출 가능한 금액(mid)로 사용할 수 있는지 확인한다.
  • 만약 mid로 사용할 수 없는 날이 나온다면, 인출 횟수를 늘려야한다.
  • 만약 인출 횟수가 M 이하라면, 가능한 K값 중 작은 범위에서 다시 탐색. 그렇지 않다면, K값을 더 큰 범위에서 탐색한다.
  • 위를 반복하여 최소금액 K를 찾으면 된다.

 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int N, M;
    cin >> N >> M;

    vector<int> dailyExpenses(N);
    int maxExpense = 0; 

    for (int i = 0; i < N; ++i) {
        cin >> dailyExpenses[i];
        maxExpense = max(maxExpense, dailyExpenses[i]);
    }

    int left = maxExpense;  
    int right = N * maxExpense;  
    int answer = right;  

    while (left <= right) {
        int mid = (left + right) / 2;
        int count = 1;  
        int total = mid;  

        for (int expense : dailyExpenses) {
            if (total < expense) {
                // 남은 금액으로 사용 불가능한 경우
                count++;
                total = mid;  // 다시 K원 인출
            }
            total -= expense;
        }

        if (count <= M) {
            answer = min(answer, mid);
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }

    cout << answer << endl;

    return 0;
}

 

 

 

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

 

6236번: 용돈 관리

현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로

www.acmicpc.net