프로그래머스Lv2 다리를 지나는 트럭
문제 설명
https://programmers.co.kr/learn/courses/30/lessons/42583
답안
나의 풀이
function solution(bridge_length, weight, truck_weights) {
let time = 0;
const bridge = [];
let bridge_weight = 0;
while (truck_weights.length) {
time++;
if (bridge.length >= bridge_length) {
bridge_weight -= bridge.shift();
}
if (bridge_weight + truck_weights[0] <= weight) {
bridge.push(truck_weights[0]);
bridge_weight += truck_weights.shift();
} else {
bridge.push(0);
}
}
return time + bridge_length;
}
시간복잡도: O(N2)
- 모든 트럭이 다리를 건널 때 걸리는 시간인 time, 다리를 건너가고 있는 트럭들을 담을 배열 bridge와 다리 위의 트럭들의 무게를 저장할 bridge_weight를 생성한다.
- 다리 위에 오를 때마다 truck_weights에서 pop해주어야 하므로 truck_weigths.length가 0이 될 때까지 while문을 돈다.
- 트럭이 건널 때마다 반복문을 돌므로 time++해준다.
- 다리 위의 트럭의 개수가 bridge_length 이상이 되면 다리에서 먼저올라 간 트럭이 내려와야하므로 bridge.shift를 하여 다리 위의 트럭 무게인 bridge_weight에서 빼준다.
- 다리 위의 트럭 무게(bridge_weight)와 첫번 째 대기 트럭(truck_weights[0])의 합이 제한 무게(weight) 이하면, 다리를 건너 갈 수 있으므로 bridge에 첫번 째 대기 트럭(truck_weights[0])을 push한다.
그리고 다리 위의 트럭 무게(bridge_weight)에 첫번 째 대기 트럭(truck_weights[0])의 무게를 shift하여 더한다. - 다리 위의 트럭 무게(bridge_weight)와 첫번 째 대기 트럭(truck_weights[0])의 합이 제한 무게(weight) 초과면, 다리를 건널 수 없으므로 0을 push한다. (위에서 bridge.length를 체크해야하므로 건너는 트럭이 없더라도 push를 해야한다. 그러나 무게에 영향을 주지 않기 위해 0을 push한다.)
- while문이 순회가 끝날 때 마지막 대기 트럭이 다리에 막 올라갔을 때이므로 마지막 트럭이 다리를 건너는 시간인 bidge_length를 time에 더해 반환해준다.