📖 오늘의 학습 키워드
이분탐색
[징검다리]
https://school.programmers.co.kr/learn/courses/30/lessons/43236
import java.util.*;
class Solution {
public int solution(int distance, int[] rocks, int n) {
int answer = 0;
int left = 1;
int right = distance;
Arrays.sort(rocks);
while(left <= right) {
int mid = (left + right) / 2;
if(removeRocks(rocks, mid, distance) <= n) {
answer = mid;
left = mid + 1;
}
else {
right = mid - 1;
}
}
return answer;
}
public int removeRocks(int[] rocks, int d, int end) {
int count = 0;
int previous = 0;
for(int i = 0; i < rocks.length; i++) {
if(rocks[i] - previous < d) {
count++;
}
else {
previous = rocks[i];
}
}
if(end - previous < d) {
count++;
}
return count;
}
}
처음에 완전탐색을 떠올렸으나 바위 개수의 범위가 50,000개이하인 것을 보고 이분탐색을 떠올리게 되었다. 바위들 사이의 거리의 최솟값을 임의로 정한다. 그리고 이 값으로 정해지는 제거할 바위의 수와 n의 값을 비교하여 최솟값을 다시 구한다.