[프로그래머스] 코딩테스트 연습 - 이분탐색 Level 4 징검다리

uoahy·2021년 9월 24일
0
post-thumbnail

Solution.java

import java.util.*;

class Solution {
    public int solution(int distance, int[] rocks, int n) {
        int answer = 0;
        
        Arrays.sort(rocks);
        
        int left = 1;
        int right = distance / (rocks.length - n + 1);
        int mid;
        
        while (left <= right) {
            mid = (left + right) / 2;
            
            int[] dist = new int[2];   // dist[0]: 왼쪽 거리, dist[1]: 오른쪽 거리
            int tmp = 0;
            for (int i = 0; i < rocks.length; i++) {
                dist[0] += (i == 0) ? rocks[i] : rocks[i] - rocks[i - 1];
                dist[1] = (i == rocks.length - 1) ? distance - rocks[i] : rocks[i + 1] - rocks[i];
                
                if (dist[0] < mid) {
                    tmp++;
                }
                else {
                    dist[0] = 0;
                }
            }
            if (dist[0] == 0) {
                if (dist[1] < mid) tmp++;
            }
            else {
                if (dist[0] + dist[1] < mid) tmp++;
            }
            
            if (tmp <= n) {
                answer = mid;
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        
        return answer;
    }
}

다른 분의 글을 참고해 힌트를 얻어 겨우 풀었다..

다음에 이런 문제를 본다면 이분탐색을 생각할 수 있을지 모르겠다.

이분탐색을 이런식으로도 사용하는구나 배울 수 있었던 문제였다.

통과하고 다른 사람의 풀이를 보니 마지막 돌 ~ 도착지점의 거리를 고려를 안 한 코드도 통과되고 있었다.

테스트 케이스가 좀 부족한것같다.

다른 사람의 풀이를 보니 좀 더 깔끔한 방식으로 거리를 비교한 코드가 있던데 다음에 고쳐봐야겠다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

0개의 댓글