본문 바로가기
Programming Solve/BOJ

BOJ 1654 - 랜선 자르기 / C++

by msm1029 2022. 3. 4.
반응형

문제 링크 : https://www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

 

문제 풀이

이미 갖고 있는 랜선들 k개를 잘라 n개의 랜선을 만들 때, 랜선 하나의 최대 길이를 구하면 된다.

그러기 위해서는 랜선의 길이를 x라 했을 때, 원소들에 대해 (LANlines[i] / x)를 구하여 몇 개의 랜선을 만들 수 있는지 구한 뒤 모두 더해 n개 이상 만들 수 있다면 정답이 될 수 있다.

 

따라서 0부터 랜선의 최대 길이를 이분 탐색하며 랜선 하나의 길이를 임의로 정하고 최댓값 최솟값을 변경해나가며 랜선 하나의 최대 길이를 구한다.

 

소스 코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int k, n; //이미 갖고 있는 랜선의 개수 k, 필요한 랜선의 개수 n
    vector<long long> LANlines;
    long long answer;

    cin >> k >> n;

    for(int i=0; i<k; i++){
        long long tmp;
        cin >> tmp;
        LANlines.push_back(tmp);
    }

    sort(LANlines.begin(), LANlines.end());

    long long st = 0;
    long long en = LANlines[k-1];

    while(st <= en){
        int cnt = 0;
        long long mid = (st + en) / 2;
        if(mid == 0){
            answer = 1;
            break;
        }

        for(int i=0; i<k; i++){
            if(LANlines[i] >= mid){
                cnt += (int)(LANlines[i] / mid);
            }
        }

        if(cnt >= n){
            answer = mid;
            st = mid + 1;
        }
        else {
            en = mid - 1;
        }
    }

    cout << answer;
}

 

시행 착오

만약 mid = 0이 된다면 DivisionByZero 에러가 발생하기 때문에 해당 경우를 예외처리해준다.

반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 2503 - 숫자 야구 / C++  (0) 2022.03.10
BOJ 1120 - 문자열 / C++  (0) 2022.03.08
BOJ 2805 - 나무 자르기 / C++  (0) 2022.03.04
BOJ 2579 - 계단 오르기 / C++  (0) 2022.02.28
BOJ 11723 - 집합 / C++  (0) 2022.02.27