Algorithm/programmers

2019 카카오 개발자 겨울 인턴쉽 - 징검다리 건너기(이분 탐색, 슬라이딩 윈도우) - Java 풀이

Ellery 2022. 3. 28. 20:38

https://programmers.co.kr/learn/courses/30/lessons/64062

 

코딩테스트 연습 - 징검다리 건너기

[2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3

programmers.co.kr

- 다리의 길이가 N = 20만이기 때문에 다리 길이에 대하여 한 번에 최대로 건널 수 있는 K 사이즈의 윈도우를 만들어서 O(N) 복잡도로 풀거나 혹은 모든 돌들의 원소값이 M = 1~2억 이므로 건너갈 수 있는 인원을 찾는 이분 탐색으로 접근하면 O(NlogM) 복잡도로 풀 수 있다.
최대한 사람들이 점프를 많이 해야 많은 사람들이 많이 건널 수 있다. 처음에는 1칸씩 뛰다가 돌이 0이 되면서 최대 K칸까지 점프할 수 있다. 따라서 이미 건널 사람을 정해놓고 이분탐색을 하므로 점프해야되는 연속된 칸의 개수가 최대 k미만이면서 최대한 많은 사람들이 건널 수 있는 수를 찾는다

- 슬라이딩 윈도우로 풀 수 있는 카카오 출제 문제 중에 광고 삽입이라는 문제가 있다. 이와 유사하게 풀 수 있다. 

import java.util.*;

class Solution {
    public int solution(int[] stones, int k) {
        int s = 1, e = (int)1e8 * 2;
        
        while(s <= e) {
            int mid = s + (e - s) / 2;
            int seq = 0, maxseq = 0;
            
            for(int n: stones) {
                if(n <= mid) ++seq;
                else {
                    maxseq = Math.max(maxseq, seq);
                    seq = 0;
                }
            }
            maxseq = Math.max(maxseq, seq);
            
            if(maxseq >= k) e = mid -1;
            else s = mid + 1;
        }
        
        return s;
    }
}