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;
        }
    }
}