본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 2110 공유기 설치

by 까망 하르방 2021. 2. 28.
반응형

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

Approach

[탐색] Parametric Search  

 

[탐색] Parametric Search

Parametric Search 최적화 문제를 결정 문제로 바꿔 푸는 것 O(logN) ex) Binary Search (이분 탐색)을 이용해서 Lower/Upper Bound를 구하는 경우가 많습니다. Binary Search (이분 탐색) Binary Search (이분 탐..

zoosso.tistory.com

Binary Search (이분 탐색)  

 

Binary Search (이분 탐색)

Binary Search (이분 탐색) 정렬된 자료에서 목표값을 찾고자 할 때, 사용되는 탐색기법 O(logN) 리스트 중간의 값(mid)을 선택하여 찾고자 하는 값과 비교하는 방식 분할 정복 알고리즘(Divide and Conquer Al

zoosso.tistory.com

공유기 3개를 설치 시, {1, 4, 8} or {1, 4, 9}에 설치하면 가장 인접한 두 공유기 사이의 거리 = 3

1 → N까지, 공유기를 설치한 앞집(Prev)과의 뒷집(Next)의 위치가 {최대거리 = 3}을 의미.

 

[2 ≤ N ≤ 200,000]이며,  [1 ≤ xi ≤ 1,000,000,000]이기 때문에 

공유기 설치할 수 있는 모든 Case를 완전탐색하여 최대 거리를 구하면 TLE 발생

 

시뮬레이션

▶ 설치 가능한 공유기 개수 『2』개 ← {1, 8}

    기준 거리(mid)가 크기에 작게 해줄 필요가 있음

 


▶ 설치 가능한 공유기 개수 『3』개 ← {1, 4, 8}

    설치하고자 하는 공유기 개수를 만족하지만 최적의 거리를 위해 left > right 될 때까지 반복

 

 

▶ 설치 가능한 공유기 개수 『3』개 ← {1, 4, 8}

    설치하고자 하는 공유기 개수를 만족하면서 이후로는 left > right 이 되므로 탐색 종료.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
    static int N, C;
    static int[] house;
     
    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());
        house = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            house[i] = Integer.parseInt(br.readLine());
        }
        // 오름차순 정렬
        Arrays.sort(house);
         
        int answer = Integer.MIN_VALUE;
        int left = 1;
        int right = house[N] - house[1];
 
        while (left <= right){
            int mid = (left + right) / 2;
             
            int cnt = 1; // 거리(mid)를 만족하는 집의 개수
            int prev = house[1]; // 첫번째 집부터 시작
            for (int i = 2; i <= N; i++) {
                // 각 집을 순회하면서 X 거리 이상 만큼 집이 떨어진 경우에
                // 공유기를 설치 가능 여부 확인
                if (house[i] - prev >= mid){
                    cnt++;
                    prev = house[i];
                }
            }
            // 간격이 작아 공유기가 많이 설치되었거나,
            // 공유기 개수를 만족했더라도 더 가까운 최소 거리 재탐색
            if (cnt >= C){  
                // 거리를 넓혀줍니다.
                left = mid+1;
                answer = mid;
            }
            // 설정한 기준이 너무 멀어 설치된 공유기 개수가 적은 경우
            else {
                // 거리를 좁혀줍니다.
                right = mid -1;
            }
        }
        // 정답 출력
        System.out.println(answer);
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 1915 가장 큰 정사각형  (0) 2021.02.28
[BOJ] 백준 1793 타일링  (0) 2021.02.28
[BOJ] 백준 2670 연속부분최대곱  (0) 2021.02.28
[BOJ] 백준 2470 두 용액  (0) 2021.02.28
[BOJ] 백준 10986 나머지 합  (0) 2021.02.28

댓글