[BOJ] 2110 공유기 설치

1 분 소요

이분탐색 예제

문제

https://www.acmicpc.net/problem/2110

문제 풀이

package Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 * Created by kyeahen.
 * Title : 2110 공유기 설치
 * Category : 이분 탐색, 매개 변수 탐색
 * Date: 2021/04/08
 */
public class BJ_2110 {

    static int N, C;
    static int[] points;

    static int result = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken()); //집의 개수
        C = Integer.parseInt(st.nextToken()); //공유기의 개수

        points = new int[N];

        //집의 좌표를 나타대는 x
        for (int i = 0; i < N; i++) {
            points[i] = Integer.parseInt(br.readLine());
        }

        Arrays.sort(points); //좌표 오름차순 정렬

        /*
        집의 좌표를 오름차순으로 정렬하여 일직선 상에 순서대로 배치한다.
        두 공유기 간의 거리는 최소는 1이고, (=> 거리는 무조건 1 이상 차이 나기 때문!)
        최대는 (집 좌표 마지막 값 - 첫번째 값)이다.
        이 구간의 값을 이분탐색으로 범위를 줄여가면서
        가장 인접한 두 공유기 사이의 최대 거리를 구한다.
         */

        int left = 1;
        int right = points[N - 1] - points[0];

        while (left <= right) { //최대 간격을 이분법으로 줄여나감
            int mid = (left + right) / 2; //공유기 간격 기준

            int start = points[0]; //첫 위치에 설치
            int count = 1; //공유기 설치 개수

            for (int i = 0; i < N; i++) {
                int dist = points[i] - start; //집마다 거리 체크

                if (dist >= mid) { //공유기 설치 가능한지 체크
                    count++;
                    start = points[i]; //설치했으면 해당 집부터 다시 간격 체크
                }
            }

            //- 공유기를 C개 이상 설치할 수 있는지
            if (count >= C) { //개수 이상 : 간격을 넓혀서 공유기 설치할 수 있는지 확인
                left = mid + 1;
                result = mid;
            } else { //개수 부족 : 간격을 줄여서 공유기 설치할 수 있는지 확인
                right = mid - 1;
            }
        }

        System.out.println(result);
    }
}

TMI

21/04/14: 알고리즘 스터디 문제 풀이🤓

댓글남기기