[프로그래머스] 징검다리

최대 1 분 소요

풀이

최솟값을 이분탐색으로 찾아낸다. 범위는 0 ~ distance이다. 돌과 돌사이의 거리를 구하고 현재의 최솟값과 비교하여 없애야 하는 돌의 개수를 구한다. 현재의 최솟값을 만족 시키기위한 돌의 개수와 매개 변수로 주어진 제거해야할 돌의 개수n과 다시 비교한다. n과 같거나 이하인 경우, n보다 큰 경우를 분기처리하여 최솟값을 조절해서 값을 구해낸다.

코드

import java.util.*;

class Solution {
      public int solution(int distance, int[] rocks, int n) {
        Arrays.sort(rocks);
        return binerySearch(distance, rocks, n);
    }
    
    public int binerySearch(int d, int[] r, int n){
        int left = 0;
        int right = d;
        int mid = (left+right)/2;
        int ans = 0;
        while (left <= right){
            int prev = 0;
            int count = 0;
            mid = (left+right)/2;
            for (int i=0; i<r.length; i++){
                if (r[i]-prev < mid)
                    count++;
                else{
                    prev = r[i];
                }
            }
            if (d - prev < mid)
                count++;
            if (count <= n){
                ans = ans < mid ? mid : ans;
                left = mid+1;
            }else{
                right = mid-1;
            }
        }
        return ans;
    }
}