코딩테스트
[다시풀기/프로그래머스] 이분탐색
_서리__
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);
// }
위에는 이분탐색을 이용한 풀이법(다른사람의 풀이 참조) 밑에는 내가 짠 슬라이딩 윈도우를 활용한 방법이다.