๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2110 ๊ณต์œ ๊ธฐ ์„ค์น˜

by Jouureee 2021. 2. 16.

๋ฌธ์ œ : 

www.acmicpc.net/problem/2110

 

2110๋ฒˆ: ๊ณต์œ ๊ธฐ ์„ค์น˜

์ฒซ์งธ ์ค„์— ์ง‘์˜ ๊ฐœ์ˆ˜ N (2 ≤ N ≤ 200,000)๊ณผ ๊ณต์œ ๊ธฐ์˜ ๊ฐœ์ˆ˜ C (2 ≤ C ≤ N)์ด ํ•˜๋‚˜ ์ด์ƒ์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ง‘์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” xi (0 ≤ xi ≤ 1,000,000,000)๊ฐ€

www.acmicpc.net

๋ถ„์„ :

์ด ๋ฌธ์ œ๋Š” ๋‚ด ๊ธฐ์ค€์„ ์—์„œ ์กฐ๊ธˆ ์‹ ๋ฐ•ํ–ˆ๋˜ (?) ์ด๋ถ„(์ด์ง„) ํƒ์ƒ‰ ๋ฌธ์ œ์˜€๋‹ค.

๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ์—๋„ ํ—ท๊ฐˆ๋ ธ๋‹ค. ์ฒ˜์Œ์— ์ •๋ ฌ์„ ํ•œ ๋’ค start ์™€ end ๋ณ€์ˆ˜๋ฅผ ๊ฐ„๊ฒฉ์˜ ์ตœ์†Œ, ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ๋กœ ์„ค์ •ํ•ด ๋‘”๋’ค ์ด ์œ„์น˜๋ฅผ mid ๊ฐ’ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด index ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝ ์‹œํ‚จ ๋’ค start ๊ฐ€ end ์ธ๋ฑ์Šค๋ณด๋‹ค ์ปค์ง€๊ฒŒ ๋˜๋ฉด ์ข…๋ฃŒํ•œ๋‹ค. ๋น„๊ต ๊ธฐ์ค€์€ mid ๊ฐ’์œผ๋กœ ์ฒซ ์ง‘์„ ๊ธฐ์ค€์œผ๋กœ for๋ฌธ์„ ๋Œ๋ฉฐ์„œ mid ๊ฐ’๋ณด๋‹ค ํฌ๊ฒŒ ๋˜๋ฉด router๋ฅผ ์„ธ์šด๋‹ค. ๋‹ค ๋Œ๊ณ ๋‚˜๋ฉด ์„ธ์šด ๋ผ์šฐ๋”์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์„ธ์šฐ๊ธฐ๋กœ ๋ช…์‹œ๋œ ๋ผ์šฐํ„ฐ์˜ ๊ฐฏ์ˆ˜๋ณด๋‹ค ๋งŽ์€์ง€ ๋น„๊ต ํ•˜๋Š”๋ฐ ํฌ๊ฒŒ ๋œ๋‹ค๋ฉด ๊ฐ„๊ฒฉ์„ ์ขํžˆ๊ธฐ ์œ„ํ•ด start ๊ฐ’์„ mid ๊ฐ’ + 1๋กœ ์„ค์ •ํ•œ๋‹ค.

์ฆ‰, ๊ณต์œ ๊ธฐ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ๋‹ค --> ์„ธ์šธ ๊ฐ„๊ฒฉ์„ ์ขํžŒ๋‹ค.  

๊ณต์œ ๊ธฐ ๊ฐฏ์ˆ˜๊ฐ€ ์•„์ง ๋ชจ์ž๋ผ๋‹ค --> ๊ฐ„๊ฒฉ์„ ๋„“ํ˜€ ์„ค์น˜ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. 

ํ›„์— max_distance์—๋Š” ๋งˆ์ง€๋ง‰์— ๋น„๊ตํ•œ mid ๊ฐ€ ๊ณง ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ์ผํ…Œ๋ฏ€๋กœ ์ด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

c++ ์ฝ”๋“œ :

//
//  2110_router.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/02/09.


#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

int find_min_distance(int home, int router, int *arr){
    int max_distance = 0;
    int start = 1; int end = arr[home - 1] - arr[0]; // ๊ฐ„๊ฒฉ ์ตœ์†Œ, ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ
    
    while(start <= end){
        int mid = (start + end) / 2;
        int set_router = arr[0]; //์ฒ˜์Œ ์„ธ์šด ๋ผ์šฐํ„ฐ
        int count = 1; // ์ฒ˜์Œ ์ง‘ count
        
        for(int i = 1; i < home; i++){//์ฒซ์ง‘์„ ์ œ์™ธํ•œ ์ง‘์„ ๋Œ๋ฉด์„œ i ๋กœ ๊ณต์œ ๊ธฐ ์„ธ์›€
            int compare = arr[i] - set_router;
            //๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง‘ ๊ฐ„๊ฒฉ์ด ์ตœ์†Œํ•œ mid๊ฐ€ ๋˜๋„๋ก ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ
            if(compare >= mid){ // ๊ฐ„๊ฒฉ์ด mid ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ดˆ๊ธฐ์—” end ์ชฝ์— ๊ฐ€๊นŒ์šด ๊ฐ’์œผ๋กœ ์…‹ํŒ…
                set_router = arr[i]; //์ดˆ๊ธฐ 8๋กœ ์…‹ํŒ…
                count++;
            }
        }
        
        if(count >= router) {
            max_distance = mid;
            start = mid + 1;
        }else{
            //์„ค์น˜ํ• ๊ฒŒ ๋‚จ์•˜์œผ๋ฏ€๋กœ ์„ค์น˜ ์ˆ˜ ์ฆ๊ฐ€
            end = mid - 1; // ๊ฐ„๊ฒฉ์„ ํ•˜๋‚˜ ๊ฐ์†Œ == ์„ค์น˜ ์ˆ˜ ์ฆ๊ฐ€
        }
    }
    return max_distance;

}


int main(){
    int home, router, distance;
    cin >> home >> router;
    int *arr = new int[home];
    for(int i = 0; i < home; i++){
        cin >> arr[i];
    }
    sort(arr, arr + home);
    distance = find_min_distance(home, router, arr);
    cout << distance << endl;
    return 0;
}

์•ž์œผ๋กœ๋Š” ๋ฌธ์ œ ํ’€๋ฉด ๋ฐ”๋กœ ๋ธ”๋กœ๊ทธ์— ์˜ฌ๋ ค์•ผ๊ฒ ๋‹ค. ๋ฌธ์ œ ๋‹ค์‹œ ๋ณด๋‹ˆ ์ดํ•ด๋„ ๋–จ์–ด์ง„๋‹ค ๊ธˆ๋ถ•์–ด ๊ฐ™๋‹ค  

๋Œ“๊ธ€