[프로그래머스] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지

Chobby·2024년 9월 9일
1

Programmers

목록 보기
349/349

이진 탐색을 하여 풀 수 있는 문제이다.

for문으로 전체 반복하고 시간초과를 맞은 후 이진 탐색의 포인트는 잡았는데

right 포인터에 Math.max(...diffs) 선언한 후 런타임 에러 폭탄을 맞았다

대체 테스트 케이스엔 어떤 값이 있길래 그러는건진 모르겠음..

😎풀이

function solution(diffs, times, limit) {
    // 투 포인터 설정
    let left = 1
    let right = 100_001 // Math.max(...diffs) 하면 런타임 에러 뜸
    
    while(left <= right) {
        // 이진 탐색을 위한 mid 선언
        const mid = Math.floor((left + right) / 2)
        if(canSolve(mid)) right = mid - 1 
        else left = mid + 1
    }
    
    // 문제 해결이 가능한 난이도인지 판별
    function canSolve(level) {
        let curTimeSum = 0
        for(let j = 0; j < diffs.length; j++) {
            const prevTime = j > 0 ? times[j - 1] : 0
            const curDiff = diffs[j]
            const curTime = times[j]
            // 내 숙련도로 현재 문제를 깬다면
            if(level >= curDiff) {
                curTimeSum += curTime
            } else {
                // 몇 번 문제를 틀릴지
                const wrongAnsTimes = curDiff - level
                // 소비될 시간
                curTimeSum += (prevTime + curTime) * wrongAnsTimes + curTime
            }
        }
        return curTimeSum <= limit
    }
    
    return left
}

profile
내 지식을 공유할 수 있는 대담함

0개의 댓글