다리를 큐라고 생각한다.
다리에 트럭이 올라갈 수 있으면 트럭의 무게를 큐에 저장한다. (트럭이 다리에 올라감)
다리에 트럭이 올라갈 수 없으면 0을 큐에 저장한다. (무게가 0인 트럭을 다리에 올림)
큐가 꽉 차면 (다리가 꽉 차면) 큐에서 트럭을 뺀다.
이 매커니즘을 반복하고,
마지막 트럭이 지나가는 시간은 따로 저장해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int truckSize = Integer.parseInt(stringTokenizer.nextToken());
int length = Integer.parseInt(stringTokenizer.nextToken());
int maxWeight = Integer.parseInt(stringTokenizer.nextToken());
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int[] truck = new int[truckSize];
for(int i = 0; i < truckSize; i++){
truck[i] = Integer.parseInt(stringTokenizer.nextToken()); //트럭의 무게
}
Queue<Integer> queue = new LinkedList<>(); //무게 저장
int time = 0, weightSum = 0;
for(int i = 0; i < truckSize; i++){
while(true){
if(queue.size() == length){ //다리가 꽉 차면 하나 내려줌
weightSum -= queue.poll();
}
if(weightSum + truck[i] <= maxWeight) break; //트럭이 올라갈 수 있으면 탈출
queue.add(0);
time++;
}
weightSum += truck[i];
queue.add(truck[i]);
time++;
}
time += length; //마지막 트럭
System.out.println(time);
}
}