프로그래머스 Lv.2: 다리를 지나는 트럭

Steve·2021년 11월 13일
0

https://programmers.co.kr/learn/courses/30/lessons/42583

전형적인 queue 를 사용하는 문제이다.
문제 자체는 큐를 사용하면 그렇게 어렵지 않으나, 최적화는 조금 어려웠다.
다른 사람의 풀이를 참고했는데, 트럭이 다리에 추가될 때 마다 그 트럭이 다리에서 나오는 시간도 같이 넣어준다. 그러면 만약에 트럭이 무거워서 다리에 다음 트럭이 못올라가면, 매번 while 문을 돌리며 트럭이 내려갈 때까지 기다리는게 아니라 트럭이 다리 맨 끝에 다다르는 시간으로 바로 점프한다.

function solution(bridge_length, weight, truck_weights) {
    let l = truck_weights.length;
    let queue = [];
    let time = 0;
    let curweight = 0, curidx = 0, count = 0;
    
    while(queue.length || count < l){
        // 1. 다리에서 나오기 - 현재 시간이 나갈 시간과 같다면 보내주고,
        //    무게 합에서 빼준다.
        if (queue[0] && queue[0][1] === time) {
            let x = queue.shift();
            curweight -= x[0];
            count++;
        }
        
        // 2. 현재 무게 + 다음 트럭 무게가 감당무게 이하면 진입
        let truck = truck_weights[curidx];
        if (curweight + truck <= weight){
            let exitTime = time + bridge_length;
            queue.push([truck, exitTime])
            curweight += truck;
            curidx++;
        }
        
        // 3. 다음 트럭이 못올라온다면 큐의
        //    첫번째 트럭이 빠지도록 그 시간으로 점프한다.
        //    참고: if 밖에서 time++ 하기 때문에 -1 해줌
        else {
            if (queue[0]) time = queue[0][1] - 1;
        }
        
        // 4. time 업데이트
        time++;
    }
    return time;
}
profile
게임과 프론트엔드에 관심이 많습니다.

0개의 댓글