Algorithm/이코테

29.공유기 설치

마닐라 2022. 1. 10. 22:02

📍 문제 설명

💡 접근

설치 거리를 중간점으로 지정해놓고 이분탐색 수행하면 된다.

 

👩‍💻 코드

import java.util.*;

public class Main {
    static int c;
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        c = kb.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        Arrays.sort(arr);
        //공유기 설치거리
        int answer = 0;

        //공유기의 설치거리를 중간점으로 지정
        int lt = 0;
        int rt = arr[n-1]-arr[0];
        while(lt <= rt) {
            int mid = (lt+rt) / 2;
            //해당 거리로 공유기 설치가 가능한지 확인
            //설치가 가능하다면 거리를 더 늘려보기
            if(installRouter(mid, arr)) {
                lt = mid + 1;
                //해당 거리를 기록
                answer = mid;
            }
            //설치가 불가하다면 거리를 더 좁혀보기
            else rt = mid - 1;
        }

        System.out.println(answer);

    }

    private static boolean installRouter(int mid, int[] arr) {
        //첫번째 지점에 일단 공유기 설치
        int cnt = 1;
        //공유기 설치한 집 번호
        int dis = arr[0];

        for(int i = 1; i < arr.length; i++) {
            //설치할 수 있는 위치이면 설치
            if(arr[i] - dis >= mid) {
                cnt++;
                dis = arr[i];
            }
        }
        //설치 가능한 거리라면
        if(cnt >= c) return true;
        return false;
    }
}

'Algorithm > 이코테' 카테고리의 다른 글

31.금광  (0) 2022.01.11
30.가사 검색  (0) 2022.01.11
28.고정점 찾기  (0) 2022.01.10
27.정렬된 배열에서 특정 수의 개수 구하기  (0) 2022.01.10
26.카드 정렬  (0) 2022.01.10