매일 BOJ

(매일 BOJ) C++ 1654번 랜선 자르기

norepinephrine 2025. 7. 25. 23:27

이번 문제는 1654번 랜선 자르기 문제이다.

접근법

가지고 있는 랜선을 잘라 같은 길이의 원하는 개수로 만드는 문제이다. 이 문제에서는 주어진 랜선의 개수가 만개 만들어야 할 랜선의 개수가 최대 100만개 이하로 주어지기에 브루트포스를 사용한다면 TLE 가 발생하는 것을 볼 수 있다.

따라서 랜선의 최소 길이를 1, 최대 길이를 가장 긴 랜선으로 설정한 후 길이를 이분탐색을 사용하여 찾아내면 TLE가 발생하지 않고 원하는 값을 찾아내는 것을 볼 수 있을 것이다.

추가적으로 이 문제에서는 랜선의 최대 길이가 2의 32승 -1 까지이기에 길이와 관련된 변수들을 long long으로 설정해야 함을 주의해야 한다.

작성코드

# include <bits/stdc++.h>
using namespace std;

int main (void){
    ios::sync_with_stdio(0); cin.tie(0);
    int have_len, need_len;
    cin >> have_len >> need_len;
    vector<long long> v;
    for(int i = 0; i < have_len; i++){
        long long num;
        cin >> num;
        v.push_back(num);
    }

    sort(v.begin(),v.end());
    long long start = 1, end = v.back();
    long long answer = 0;

    while(start <= end){
        long long mid = (start + end) / 2;
        long long count = 0;

        for(int j = 0; j < v.size(); j++){
            count += v[j] / mid;
        }

        if(count >= need_len){
            answer = mid;
            start = mid + 1;
        }
        else{
            end = mid - 1;
        }
    }
    cout << answer;
}