[ 백준 ] 2110 / 공유기 설치

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
128/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 2110 / 공유기 설치
 *
 * Kind :: Binary Search
 *
 * Insight
 * - Greedy 하게 풀 수 있나?
 *   + X[0] 과 X[N-1] 에 공유기 설치하고
 *     가운데 적절히 놓으면 되지 않을까?
 *     # 적절히 놓을 때 거리에 따라 놓는 기준이 있어야 되는데...
 *       이 적절히를 알고리즘으로 구현하기가 너무 까다롭다
 *       (다루어야 할 상황이 너무 복잡하고 다양하다)
 *       -> 이럴바엔 인접한 거리를 사전에 정하고 X[0] 에 공유기 설치 후,
 *          인접한 거리 이상으로 놓아보면서 가능한지 판별하자 => 이분 탐색이넹
 *
 * - 사전에 정한 인접거리가 클수록 공유기를 설치하는 개수는 적어지고
 *   사전에 정한 인접거리가 작을수록 공유기를 설치하는 개수는 많아지니
 *   단조감소함수이며 이분 탐색을 쓸 수가 있었구나~
 *
 * Point
 * - 좌표가 [1, 10^9] 이다.
 *   + long 을 사용하도록 하자
 *
 * - 사전에 정한 인접거리에 따라 공유기를 설치했을 때,
 *   공유기의 개수 C 보다 더 설치가능하다면
 *   이는 결국 공유기를 주어진 조건에 부합하게 설치 가능하다는 것이다
 *   (즉, 이는 가장 인접한 공유기가 사전에 정한 인접거리 이상인채로
 *    공유기 C개 이상을 설치가능하다는 뜻이다)
 *   + 위는, C개 까지 설치한 후 더이상 설치 안하는 것으로 간주할 수 있다
 *     # 무튼, 성공이다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <algorithm>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N, C;
    cin >> N >> C;
    long X[N];
    for (int i=0; i<N; i++) {
        cin >> X[i];
    }

    // Process
    sort(X, X+N);

    long l = 1;
    long r = X[N-1];

    long ans = -1;
    while (l <= r) {
        long m = (l + r) / 2; /* 사전에 가장 인접한 공유기의 인접거리를 정함 */

        int cnt = 1;
        long cpos = X[0]; /* 마지막으로 공유기가 설치된 위치 */
        for (int i=1; i<N; i++) {
            if (cpos+m <= X[i]) { /* X[i] 가 마지막으로 공유기가 설치된 위치로부터
                                   * 사전에 정한 인접거리 이상만큼 떨어져 있을 때 */
                cnt++; /* 공유기 설치 및 */
                cpos = X[i]; /* 마지막으로 공유기가 설치된 위치 갱신 */
            }
        }

        if (cnt >= C) { /* 성공 */
            ans = m;
            l = m+1; /* 인접거리를 늘려볼까? */
        } else { /* 실패 */
            r = m-1; /* 인접거리를 줄여야한다! */
        }
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이
post-custom-banner

0개의 댓글