https://school.programmers.co.kr/learn/courses/30/lessons/64062
function solution(stones, k) {
const arr = [...stones].sort((a,b)=>b-a)
const set = new Set(arr)
let idx = 0
while (idx < set.size) {
let maxV = [...set][idx]
let flag = true
let cnt = 0
for (let i=0; i<stones.length; i++) {
// stone이 maxV보다 같거나 크다 : 건널 수 있다.
// stone이 maxV보다 작다 : 건널 수 없다.
const stone = stones[i]
if (stone >= maxV) cnt = 0
else cnt ++
// [종료조건]. 건널 수 없는 횟수(cnt)가 k와 같거나 커지면, 징검다리 건너기실패.
if (cnt >= k) {
idx ++
flag = false
break
}
}
// [종료조건]. 최대값부터 순서대로 내려오니까, 가장 먼저 통과한 값이 answer.
if (flag) return maxV
}
}
function solution(stones, k) {
var answer = 0;
// 배열 크기가 매우 커지면, 스프레드 연산자에서 에러 발생함.
// let right = Math.max(...stones)
// let left = Math.min(...stones)
let right = stones[0];
let left = stones[0];
for (let i = 1; i < stones.length; i++) {
right = Math.max(right, stones[i]);
left = Math.min(left, stones[i]);
}
while (left <= right) {
let mid = Math.floor((left+right)/2)
let cnt = 0
let flag = true
for (let i=0; i<stones.length; i++) {
const stone = stones[i]
if (stone >= mid) cnt = 0
else cnt ++
if (cnt >= k) {
flag = false
break
}
}
// 징검다리 건너기 성공했으면, 숫자(mid)를 높여봄.
if (flag) {
left = mid + 1
answer = mid
// 건너기 실패했으면, 숫자(mid)를 낮춤.
} else {
right = mid - 1
}
}
// 이진탐색이 끝나면, 징검다리 건너기에 성공한 최대값이 answer에 할당되어 있음.
return answer
}