Algorithm/Problem Solving

[BOJ] 2110번 공유기 설치 - JAVA(자바)

gangintheremark 2023. 9. 14. 14:36
728x90
 

2110번: 공유기 설치

첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가

www.acmicpc.net

💡 이진탐색(Binary Search) 문제

구하고자 하는 것 : 두 공유기 사이의 최대거리


lt = 1

rt = arr[n-1] ➜ 너무 세세하게 생각X. 그냥 가장 멀리있는 좌표 선택

➜ 답(두 공유기의 최대거리)은 lt~rt 사이에 확실하게 있다.

 

mid = (lt + rt ) / 2 

 

가장 인접한 두 공유기의 거리를 mid라고 했을 때, 답이 가능한지 검증 ➜ 공유기의 배치 수를 count하는 함수 생성

  • 검증 성공 시, 최대 거리를 구해야 하므로 오른쪽 부분에서 찾기 lt=mid+1
  • 검증 실패 시, 왼쪽 부분에서 찾기 rt=mid-1
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;

class Main {
    public int count(int[] arr, int dist) {
        int cnt = 1;
        int ep = arr[0]; // 공유기는 시작점에 배치
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] - ep >= dist) {
                // 정한 최대거리(mid)보다 크거나 같으면 공유기 배치
                cnt++;
                ep = arr[i];
            }
        }
        return cnt;
    }

    public long solution(int c, int[] arr) {
        Arrays.sort(arr); // 배열 정렬
        int answer = 0;
        int lt = 1;
        int rt = arr[arr.length-1];

        while (lt <= rt) {
            int mid = (lt + rt) / 2;

            // c 개 보다 공유기를 더 많이 놓을 수 있다면 거리를 넓혀야됨.
            if (count(arr, mid) >= c) {
                answer = mid;
                lt = mid + 1;
            } else rt = mid - 1;
        }

        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner s = new Scanner(System.in);

        int n = s.nextInt();
        int c = s.nextInt();

        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = s.nextInt();
        }

        System.out.println(T.solution(c,arr));

    }
}

 


 

[JAVA/알고리즘] 이진 탐색 알고리즘을 이용한 문제해결

이진 탐색(Binary) 알고리즘을 이용해서 해결해야 하는 문제 유형은 비슷하다. 주로 최대/최소를 물어본다. 1. lt 와 rt를 정했을 때, lt ~ rt 사이에 분명 답이 있다는 확신 2. mid = (lt+rt)/2 가 답으로써

gangintheremark.tistory.com

 

728x90