[プログラマー/スタック-キュー/3]ブリッジトラック(JS)


ソース:プログラマコードテストスタック/キュー第3題
( https://programmers.co.kr/learn/courses/30/lessons/42586 )

問題の説明


何台ものトラックが川にまたがる橋を所定の順序で渡りたいと思っている.すべてのトラックが橋を渡るのに少なくとも数秒かかります.橋の上で、トラックは最大bridge lengthロッドに乗ることができ、橋は重量より低い重量に耐えることができる.しかし、完全に橋を上がっていないトラックの重さは無視される.
例えば、2台のトラックに乗ることができ、10キロの重量に耐えられる橋があります.重量[7,4,5,6]kgのトラックは最短時間で順番に橋を渡りますので、次のように橋を渡ります.
そのため、すべてのトラックは少なくとも8秒で橋を渡ることができます.
solution関数のパラメータには、ブリッジに上がることができるトラックの数bridge length、足が受ける重量、トラック1台当たりの重量cart weightsが含まれます.解の関数を完了し、すべてのトラックが橋を渡るのに少なくとも数秒かかります.

せいげんじょうけん

  • bridge lengthは1 10000より大きい.
  • 重量は1以上10000以下である.
  • cart weightsの長さは1または10000以下です.
  • すべてのトラックの重量は1以上です.
  • 解答方法


    ソースコード

    function solution(bridge_length, weight, truck_weights) {
        var answer = 0
        const waitingTrucks = truck_weights.map((weight) => ({ weight, enterTime: -1 }))
        const trucksOnBridge = []
        const passedTrucks = []
        let currentBridgeWeight = 0
        let time = 0
        while (passedTrucks.length !== truck_weights.length) {
            time = time + 1
            // 다리 지나가는 부분
            if (trucksOnBridge.length !== 0) {
                if (time - trucksOnBridge[0].enterTime === bridge_length) {
                    currentBridgeWeight -= trucksOnBridge[0].weight
                    passedTrucks.push(trucksOnBridge.shift())
                }
            }
            // 다리로 들어오는 부분
            if (waitingTrucks.length !== 0) {
                if (weight >= currentBridgeWeight + waitingTrucks[0].weight) {
                    currentBridgeWeight += waitingTrucks[0].weight
                    waitingTrucks[0].enterTime = time
                    trucksOnBridge.push(waitingTrucks.shift())
                }
            }
        }
        return time
    }

    ポスト