알고리즘 공부/문제 풀이

[프로그래머스] 이분 탐색 - 징검다리

valid_ming 2020. 9. 1. 17:43

 

이 문제 또한 전과 마찬가지로 블로그를 보고 해결하였다.

문제 해결법은 전과 비슷했지만.. 해결 방법을 생각하는 것이 아직 어려운 것 같다

 

풀이방법

최소거리를 찾고, 그 최소 거리보다 작은 바위들을 제거한다.

제거된 바위 수가 n보다 크다면 거리를 좁히고, n보다 작다면 거리를 늘리며

최소 거리 중 최대 거리를 찾는다.

 

import java.util.*;

class Solution {
    public int solution(int distance, int[] rocks, int n) {
    Arrays.sort(rocks);

    int answer = 1;
    int start = 1;
    int end = distance;
    
    while (start <= end) {
      int mid = (start + end) / 2;
      
      int cnt = 0;
      int last = 0;
      for (int i = 0; i < rocks.length + 1; i++) {
        int gap = i != rocks.length ? rocks[i] - last : distance - rocks[i-1];
        if (gap < mid) {
          cnt++;
        } else if(i != rocks.length) {
          last = rocks[i];
        }
      }
      
      if (cnt > n) {
        end = mid - 1;
      } else {
        start = mid + 1;
        answer = mid;
      }
    }
    
    return answer;
    }
}