import java.util.*;
class Solution {
public int solution(int bridgeLength, int weight, int[] truckWeights) {
Queue<Truck> truckQueue = new ArrayDeque<>();
for(int truckWeight : truckWeights){
truckQueue.add(new Truck(-1, truckWeight));
}
int availableWeight = weight;
Queue<Truck> bridgeQueue = new ArrayDeque<>();
int time = 0;
//둘다 비면 멈춘다.
while(!(truckQueue.isEmpty() && bridgeQueue.isEmpty())){
++time;
// 다리에 올라가 있는 트럭들 중에서 도착한거 지운다. 그리고 무게 늘려준다. 가느한 무게가. 다리에서 벗어났으니
if(!bridgeQueue.isEmpty() && time - bridgeQueue.peek().startTime == bridgeLength){
availableWeight += bridgeQueue.poll().weight;
}
//트럭이 올라갈 자리는 있는가?
if(bridgeQueue.size() >= bridgeLength) continue;
//남은 트럭이 있는가
if(truckQueue.isEmpty()) continue;
//자리가 있다면 무게는 되는가?
if(availableWeight < truckQueue.peek().weight) continue;
//올라간다면 가능한 무게를 갱싱해준다.
Truck goTruck = truckQueue.poll();
availableWeight -= goTruck.weight;
goTruck.startTime = time;
//올린다.
bridgeQueue.add(goTruck);
}
return time;
}
static class Truck{
int startTime;
int weight;
Truck(int st, int w){
this.startTime = st;
this.weight = w;
}
}
}