[프로그래머스]다리를 지나는 트럭

2022년 7월 12일

function solution(bridge_length, weight, truck_weights) {
  let tick = 0;
  let currentBridgeWeight = 0;

  const waitingTrucks = [...truck_weights];
  const passingTrucks = [];
  const passedTrucks = [];

  while (passedTrucks.length !== truck_weights.length) {
    tick += 1; // 1초 경과

    // 현재 경과된 시간과 트럭이 진입한 시간차가 다리 길이 만큼이면 첫번째 passingTruck을 옮겨줌.
    if (
      passingTrucks.length > 0 &&
      tick - passingTrucks[0].tick === bridge_length
    ) {
      const { truck: passedTruck } = passingTrucks.shift();

      currentBridgeWeight -= passedTruck;
      passedTrucks.push(passedTruck);
    }

    // 다리에 진입하기 위한 무게 체크
    if (
      waitingTrucks.length > 0 &&
      currentBridgeWeight + waitingTrucks[0] <= weight
    ) {
      const truck = waitingTrucks.shift();

      currentBridgeWeight += truck;
      passingTrucks.push({ truck, tick }); // 견딜 수 있는 무게면 truck숫자와 언제 다리에 진입했는지 저장
    }

    // else { // 다리에 더이상 진입하지 못하면 첫번째 passing중인 트럭을 마지막으로.
    //     tick += bridge_length - tick - passingTrucks[0].tick - 1;
    // }
  }

  return tick;
}