백준 문제/이분탐색

[백준] 16401번 과자 나눠주기

dubu0721 2025. 3. 14. 19:06

문제: 16401번: 과자 나눠주기

basic-algo-lecture/workbook/0x13.md at master · encrypted-def/basic-algo-lecture

 

basic-algo-lecture/workbook/0x13.md at master · encrypted-def/basic-algo-lecture

바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.

github.com

 

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <limits>
#include <string>

using namespace std;

int binarySearch(int target, vector<int>& cookies) {
    int st = 1;
    int en = cookies[cookies.size()-1];

    int answer = 0;
    while (st <= en) {
        int tmpCnt = 0;
        int mid = (st + en) / 2;

        for (int i = 0; i < cookies.size(); i++) {
            tmpCnt += cookies[i] / mid;
        }

        if (tmpCnt >= target) {
            answer = mid;
            st = mid + 1;
        }
        else {
            en = mid - 1;
        }
    }
    return answer;
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int m, n;
    cin >> m >> n;
    vector<int> cookies(n);
    for (int i = 0; i < n; i++)
        cin >> cookies[i];

    // 걍 이분탐색 돌려여
    sort(cookies.begin(), cookies.end());
    cout << binarySearch(m, cookies);

    return 0;
}

 

음.. 걍 쿠키들을 오름차순으로 정렬해놓고 이분탐색 돌리면 된다.

 

맨 처음 시작할 때 st=1, en=쿠키 중에서 가장 큰 값으로 설정한다. 그 후 st<=en 일 때까지 while 문 돌리면서 mid 값 갱신해주고 계속~~~ 이분탐색 돌리면 된다.

 

마지막에 answer 리턴해주면 간단하게 해결 ~_~