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;
}