트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다. ※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.
답안은 접어놨습니다.
한참을 고민하면서 낑낑거리다가 풀긴 풀었는데, 이상하게 테스트1에서 경과시간이 초과됐다. console.log를 찍어봐도 정확한 원인을 몰라서, 몇시간동안 머리를 쥐어뜯었다. 결국 다른사람의 답안을 봤지만, 딱히 차이점을 발견하진 못했다.
function solution(bridge_length, weight, truck_weights) {
var time = 0;
let onBridge = [];
while(truck_weights.length > 0 || onBridge.length > 0) {
var sumOnBridge = 0;
for(let i in onBridge) {
onBridge[i].remainTime--;//onBridge Queue에 남아있는 시간을 전부 줄인다.
// sumOnBridge+=onBridge[i].weight;//onBridge Queue에 남아있는 트럭의 무게를 합산한다.
}
//remainTime이 남아있지 않은 트럭은 다리에서 제거한다.
if(onBridge.length>0 && onBridge[0].remainTime==0) {
onBridge.shift();
}
for(let i in onBridge) {
sumOnBridge+=onBridge[i].weight;
}
//다리에 트럭을 올릴 수 있는지 확인한다.
if((sumOnBridge+truck_weights[0]) <= weight) {
onBridge.push({
weight: truck_weights.shift(),
remainTime: bridge_length
});
}
time++;
}
return time;
}
늘 그렇듯 원인은 생각보다 단순했다. 9번째 줄에 주석처리한 부분이 문제였는데, 반복문 한 번에 처리할 수 있는 일을 몰아서 처리하려고 했던 것이다. 결국 remainTime을 줄여놓고선, 이 값이 0인 트럭의 값까지 합산하기 때문에 트럭이 다리에 올라갈 수 있음에도 올라가지 못하는 상황이 발생했던 것이다. = ㅅ=)