[boj] (s3) 1654 랜선 자르기

강신현·2022년 2월 15일
0

문제 링크

이미 가지고 있는 랜선의 개수 K
필요한 랜선의 개수 N

구하는 토막의 길이의 범위는 (1~가지고 있는 랜선의 최대 길이)

최소 길이인 1에서부터 최대 길이까지 랜선들을 나누어보면 되지만
비효율적이므로 토막의 길이를 최소와 최대 길이의 반으로 하여 랜선들을 나누어보는 식으로 탐색

try1

틀렸다고 떴다.
문제를 자세히 읽어보니
K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수 이다.

✅ long long 자료형

즉, int 형으로는 두변수의 범위를 다 담을 수 없기 때문에 보다 넓은 범위인 long long 형으로 바꿔주었다.

try2

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

using namespace std;

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

    int K, N;
    cin >> K >> N;

    vector<int> arr;

    for (int i = 0; i < K; i++)
    {
        int line;
        cin >> line;
        arr.push_back(line);
    }

    long long min = 1, max = *max_element(arr.begin(), arr.end());

    long long mid, cnt, ans;
    while (min <= max)
    {
        mid = (min + max) / 2;
        cnt = 0;

        for (int i = 0; i < K; i++)
        {
            cnt += arr[i] / mid;
        }

        if (cnt < N)
        {
            max = mid - 1;
        }
        else
        {
            min = mid + 1;
            ans = mid;
        }
    }

    cout << ans;

    return 0;
}
profile
땅콩의 모험 (server)

0개의 댓글