코딩테스트

[다시풀기/프로그래머스] 이분탐색

_서리__ 2023. 6. 9. 18:41
function solution(stones, k) {
    // 이분탐색을 사용한다.
    let left = 1;
    let right = 200000000;

    while(left <= right) {
        const mid = Math.floor((left + right) / 2)

        let count = 0;
        for(let i = 0; i < stones.length; i++) {
            if(stones[i] - mid <= 0) count++;
            else count = 0;

            if(count === k) break;
        }

        if(count === k) right = mid - 1;
        else left = mid + 1;
    }

    return left;
}

// function solution(stones, k) {
//     var answer = 0;
//     //어렵네 
//     //일일이 돌면서 +하는 방법도 있을거고, 더 좋은 방법도 있을텐데...
//     //이중포문 실패했음. 즉 한번의 for문으로 해결해야한다는건데...
//     //이번에도 윈도우를 이용한다 치면...
//     //일단 제일 작은 숫자만큼은 다 이용할 수 있음.
//     //k 크기로 윈도우를 넣고 그 사이에서는 제일 큰 값인것들을 배열에 저장하고 그 중 제일 작은것을 고르면됨.
//     let left = 0;
//     let right = k
//     let maxArr = []
//     let windowArr = stones.slice(left,right)
//     if(k===stones.length){ return Math.max(...stones)}
   
//     while(right<stones.length){
//         //이전의 right이 다음턴에 안으로 들어오고 이전의 left가 다음턴에 밖으로 빠지는 것임.
//        let max = Math.max(...stones.slice(left,right))
//        maxArr.push(max)
//         left++;
//         right++;
//     }
//     return Math.min(...maxArr);
// }

위에는 이분탐색을 이용한 풀이법(다른사람의 풀이 참조) 밑에는 내가 짠 슬라이딩 윈도우를 활용한 방법이다.