우보천리 개발

[BJ] 2110 공유기 설치 Java 본문

알고리즘/백준

[BJ] 2110 공유기 설치 Java

밥은답 2023. 2. 9. 17:04
반응형

백준 2110 공유기 설치

https://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

 

아이디어

  • 집의 좌표가 입력으로 최대 10억개 들어올 수 있기에 시간초과에 걸릴 수 있다
  • 이진탐색을 사용하면 매번 데이터의 개수를 절반으로 줄일 수 있기 때문에 이분탐색으로 풀어나간다
  • 우선 좌표를 오름차순으로 정렬해야 이진탐색 가능
  • 공유기 사이의 최소길이는 1이다. 최대길이는 배열의 가장 큰 값이다
  • 공유기 배치를 주어진 입력값보다 많이 할 수 있으면 간격을 늘린다
  • 입력값보다 적게할 수 있는거면 공유기들 사이의 거리를 더 늘려본다

코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int c = sc.nextInt();
        ArrayList<Integer> al = new ArrayList<>();
        for (int i=0; i<n; i++) {
            al.add(sc.nextInt());
        }
        Collections.sort(al);

        // 이진탐색
        // 공유기 사이의 최소거리는 1, 최대 거리는 배열에서의 가장 큰 값(즉 마지막 값)
        int lt = 1;
        int rt = al.get(n-1);
        int answer = 0;

        while (lt <= rt) {
            int mid = (lt+rt) / 2;
            // c개 이상 배치 가능하면 간격을 더 늘려본다
            if (count(al, mid) >= c) {
                answer = mid;
                lt = mid + 1;
            }
            // 그렇지 않다면 간격을 좁힌다
            else rt = mid - 1;
        }

        System.out.println(answer);
    }

    public static int count(ArrayList<Integer> al, int mid) {
        int count = 1; // 공유기 처음 1개 설치
        int pos = al.get(0); // 맨 왼쪽에 있는 곳에 설치해야 최대거리 가능

        for (int i=0; i<al.size(); i++) {
            if (al.get(i) - pos >= mid) {
                count++;
                pos = al.get(i);
            }
        }
        return count;
    }
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BJ] 1715 카드 정렬하기  (0) 2023.02.02
[BJ] 18310 안테나 Java  (0) 2023.02.01
[BJ] 10825 국영수 Java  (0) 2023.02.01
[BJ] 18428 감시 피하기 Java  (0) 2023.01.31
[BJ] 14888 연산자 끼워넣기 Java  (0) 2023.01.30
Comments