알고리즘 풀이/프로그래머스

프로그래머스 - 징검다리 (이분탐색)

배게 2019. 11. 29. 20:16
728x90

이해가 안되는거 주석으로 써놓음 아직도 이해안감


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    public int solutionFin(int distance, int[] rocks, int n) {
        int answer = 0;
        Arrays.sort(rocks);
        // for(int i : rocks){
        //     System.out.println(i);
        // }
        // System.out.println();
 
        int cnt, current;
 
        int left = 0, right = distance, mid = 0;
        while (left <= right) {
            int min = distance;
            cnt = 0;
            mid = (left + right) / 2;
            current = 0;
            for (int i = 0; i < rocks.length; i++) {
                if (rocks[i] - current < mid)
                    cnt++;
                else {
                    min = Math.min(min, rocks[i] - current);
                    current = rocks[i];
                }
            }
            if (distance - current < mid)
                cnt++;
 
            // System.out.println(left+" "+mid+" "+right);
            // System.out.println(cnt);
            // System.out.println(min);
 
            if (cnt > n) {
                right = mid - 1;
            }
            // 정말 이해가 안가는 부분인데 cnt==n말고 cnt<n인 부분 또한 answer를 정의할 수 있는 것이 가능하다는 건 이해가 안간다..
            else {
                // 이걸 이렇게 박는 것으로 봐서는 이분탐색 탈출 후 최종 mid값이 문제에서 요구하는 최적해가 아니라는 소리가 아닌가 싶다..참 헷갈린다
 
                answer = Math.max(answer, mid);
 
                left = mid + 1;
            }
            // System.out.println(answer);
            // System.out.println();
            // if(cnt==n) answer = Math.max(answer,min);
 
        }
 
        return answer;
    }
cs