출처: https://www.acmicpc.net/problem/2110
Approach
[탐색] Parametric Search
Parametric Search 최적화 문제를 결정 문제로 바꿔 푸는 것 O(logN) ex) Binary Search (이분 탐색)을 이용해서 Lower/Upper Bound를 구하는 경우가 많습니다. Binary Search (이분 탐색) Binary Search (이분 탐..
zoosso.tistory.com
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 |
댓글