본문 바로가기
programmers

프로그래머스 징검다리 건너기 (이분탐색, java)

by socialcomputer 2022. 5. 13.
 

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

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

programmers.co.kr

범위가 커서 이분탐색으로 풀어야 한다. 

1. 징검다리 돌 중에 제일 큰 값을 찾아 건널수 있는 동물 수의 상한선으로 두고
2. 이분탐색으로 건널수 있는 동물 수를 찾는다
3. 2번에서의 조건은 'stone - animal <0 가 k번 이상 연속되면 안된다' 이다. 
--> 0인 돌이 2개면 3번 점프해서 건너야 한다. 
class Solution {
    public int solution(int[] stones, int k) {
        int answer = 0;
        int lo = 1;
        int hi = Arrays.stream(stones).max().getAsInt();
        int mid = 0;
        while(lo<=hi){
            mid = (lo+hi)/2;
            if(!isPossible(mid, k, stones)){// 불가능하면 줄여야됨
                hi = mid-1;
            }else{// 가능하면 늘리기
                answer = mid;
                lo = mid+1;
            }
        }
        return answer;
    }
    public boolean isPossible(int animal, int jump, int[] stones){
        // jump가 3이면 0미만인 돌이 2게를 초과하면 즉 3개 이상이면 불가능함
        // jump = 3이면 cnt==jump일때 return false
        int cnt=0;
        for(int i=0; i<stones.length; i++){
            if(stones[i]-animal < 0){
                cnt++;
                if(cnt>=jump) return false;//
            }
            else cnt = 0;
        }
        return true;
    }
}

 

 

이분탐색은 매번 범위를 절반으로 줄여가며 탐색해서 순차탐색시 O(N^2) 걸리던 것을 O(logN) 시간복잡도를 가지게 한다. 

이분탐색시 구하려는 값에 따라서 조금씩 변화를 줘야 하는데 헷갈려서 검색하던 중 다음과 같은 글을 발견..

 

이분 탐색(Binary Search) 헷갈리지 않게 구현하기

개요 이분 탐색은 off-by-one error가 발생하기 쉬워서 늘 헷갈립니다. 이분 탐색 문제를 풀다보면 탈출 조건으로 lo <= hi, lo < hi, lo + 1 < hi 중 어느 걸 선택해야 할 지, 정답이 lo인지 hi인지 (lo + hi) / 2

www.acmicpc.net

 

댓글