다리를 지나는 트럭
문제
다리를 지나는 트럭
풀이
function solution(bridge_length, weight, truck_weights) {
let time = 0;
let done = [];
let ing = [];
let all_trucks = truck_weights.length;
while(done.length < all_trucks){
if(ing.length && ing[0].position === bridge_length){
const leave_truck = ing.shift();
done.push(leave_truck);
}
const truck = truck_weights[0];
const all_weights = ing.reduce((acc, cur) => acc + cur.weight, 0) + truck;
if(all_weights <= weight){ //하중 견딜만할 때
ing.push({ weight : truck , position : 0}); // 새 트럭 진입
truck_weights.shift(); // 대기열에서 빼기
}
//시간 지난거 체크해줘야지
ing.forEach(e => e.position++);
time++;
}
return time;
}
- 걸리는 시간(time), 다 건넌 차 리스트(done), 다리위에있는 차 (ing), 모든 차 갯수(all_trucks)
- 다 건넌 차의 수가 모든 차 보다 적을 때만 반복을 한다. (while)
- 다리위에 차가 하나라도 있고, 다리위 첫번째 차의 위치가 다리 끝일때 트럭을 뽑아서 다 건넌곳으로 옮겨준다
- 대기열의 첫번째 트럭을 참조하고, 현재 다리위의 무게를 체크한후 트럭과 합쳤을때 하중이 넘지 않는지 본다.
- 하중이 견딜만 하면, 새 트럭이 진입하고, 대기열에서 트럭을 빼준다.
- 현재 다리위에 있는 차들의 위치를 1씩 옮겨준다. (1초당 1만큼 이동)
- 차가 다리를 다 건너면 걸린 시간을 리턴한다.
- 리팩토링 한다면
- 현재 다리위의 하중을 리듀스로 매번 계산하는 부분을 변경하고싶다.
- 미리 빈배열로 다리를 만들어 놓고 나서 하는 방식으로도 해보고 싶음