function solution(bridge_length, weight, truck_weights) {
const queue = []; // 다리를 건너는 트럭을 담을 큐 배열
let time = 0; // return 할 값
let totalW = 0; // 다리에 오른 트럭의 총 무게
while(truck_weights.length || queue.length){
// truck_weights와 queue에 남은 요소가 없을 때까지 반복
if(queue.length){ // 다리를 건너는 중인 트럭이 있을 때
if(queue[0][1] === time){
// queue의 첫번째 요소(처음 들어온 트럭)이 다리를 모두 건널 시간과 걸린 시간이 같으면
const end = queue.shift() // 해당 요소를 빼기
totalW -= end[0];
}
}
if(truck_weights.length){ // 대기중인 트럭이 있을 때
if(totalW+truck_weights[0] <= weight && queue.length < bridge_length){
// 현재 무게와 다음 들어올 트럭 무게가 다리가 견딜 수 있는 무게를 넘지 않을 때 + 다리가 견딜 수 있는 트럭 수를 넘지 않았을 때
const now = truck_weights.shift();
queue.push([now, time+bridge_length])
// 트럭의 무게와 트럭이 나갈 시간을 queue에 추가
totalW += now;
}
}
time++;
}
return time;
}
function solution(bridge_length, weight, truck_weights) {
// '다리'를 모방한 큐에 간단한 배열로 정리 : [트럭무게, 얘가 나갈 시간].
let time = 0, qu = [[0, 0]], weightOnBridge = 0;
// 대기 트럭, 다리를 건너는 트럭이 모두 0일 때 까지 다음 루프 반복
while (qu.length > 0 || truck_weights.length > 0) {
// 1. 현재 시간이, 큐 맨 앞의 차의 '나갈 시간'과 같다면 내보내주고,
// 다리 위 트럭 무게 합에서 빼준다.
if (qu[0][1] === time) weightOnBridge -= qu.shift()[0];
if (weightOnBridge + truck_weights[0] <= weight) {
// 2. 다리 위 트럭 무게 합 + 대기중인 트럭의 첫 무게가 감당 무게 이하면
// 다리 위 트럭 무게 업데이트, 큐 뒤에 [트럭무게, 이 트럭이 나갈 시간] 추가.
weightOnBridge += truck_weights[0];
qu.push([truck_weights.shift(), time + bridge_length]);
} else {
// 3. 다음 트럭이 못올라오는 상황이면 얼른 큐의
// 첫번째 트럭이 빠지도록 그 시간으로 점프한다.
// 참고: if 밖에서 1 더하기 때문에 -1 해줌
if (qu[0]) time = qu[0][1] - 1;
}
// 시간 업데이트 해준다.
time++;
}
return time;
}
3번의 시간을 바로 업데이트 해주는 부분은 생각하지 못했다 해당 식을 사용하면 아무것도 하지 않고 시간만 업데이트하는 부분을 생략 가능, 좀 더 빠르게 식이 끝날 수 있을 것 같다