본문 바로가기

개발/알고리즘

백준 6236 용돈관리 C++

문제

www.acmicpc.net/problem/6236

 

6236번: 용돈 관리

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

www.acmicpc.net

코드1

#include<bits/stdc++.h>

using namespace std;

int n, m, a[100001];

bool check(int mid)
{
    int cnt = 1;
    int money = 0;
    for (int i = 0; i < n; i++)
    {
        if (money + a[i] > mid)
        {
            if(a[i] > mid)
                return false;
            cnt++;
            money = a[i];
        }
        else
        {
            money += a[i];
        }

        if (cnt > m)
        {
            return false;
        }
    }

    return true;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }

    int lo = 1, hi = 100004, ans = n;

    while (lo <= hi)
    {
        int mid = (lo + hi) / 2;

        if (check(mid))
        {
            ans = mid;
            hi = mid - 1;
        }
        else
        {
            lo = mid + 1;
        }
    }

    cout << ans << "\n";

    return 0;
}

코드2

#include<bits/stdc++.h>

using namespace std;

int n, m, a[100001];

bool check(int mid)
{
    int cnt = 1;
    int money = 0;
    int extraMoney = mid;
    for (int i = 0; i < n; i++)
    {
        extraMoney -= a[i];
        if (extraMoney < 0)
        {
            if(a[i] > mid)
                return false;
            
            cnt++;
            extraMoney = mid;
            extraMoney -= a[i];
        }

        if (cnt > m)
        {
            return false;
        }
    }

    return true;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }

    int lo = 1, hi = 100004, mid, ans;

    while (lo <= hi)
    {
        mid = (lo + hi) / 2;

        if (check(mid))
        {
            ans = mid;
            hi = mid - 1;
        }
        else
        {
            lo = mid + 1;
        }
    }

    cout << ans << "\n";

    return 0;
}

 

처음에 코드1에서 아래 경우에 대한 예외처리를 안해줘서 로직 자체가 틀린 줄 알고 코드2로 시도했다.

if(a[i] > mid) return false;

 

코드2에서 혹시나 싶어서 위 예외처리 해줬더니 맞길래

코드1에서도 위 예외처리 다시 한 다음에 제출하니까 정답이었다.

 

a[i]값이 mid 값보다 클때는 무조건 실패처리가 맞는건가 ?