


정말 오랜만에 푼 시뮬레이션. 시도해보았는데 Queue를 이용하는 것까진 생각해냈지만 도저히 로직이 생각나지 않아 풀이를 참고했다 ㅠ.ㅠ
나는 다리 위에 올라간 트럭만 Queue에 넣으려고 했는데 풀이를 보니 트럭도 Queue에 넣는 방법으로 풀이하여 참고해서 풀어봤다!
1. 다리 위에 올라 간 트럭은 bridge Queue에, 트럭은 truck Queue에 넣어주었다. 이때, bridge에는 미리 w번만큼 0을 넣어준다.
2. while문은 bridge가 빌때까지 반복되고 while문이 반복될때마다 time은 ++된다. 총 하중인 weight에서 가장 처음 bridge에 넣었던 트럭의 무게를 빼준다. 이는 다리에서 트럭이 지나갔다는 뜻이다.
3. truck이 비지 않았다면, truck의 가장 첫번째 트럭을 가져와서 weight와 더했을때 최대 하중인 L보다 작다면 bridge에 넣는다. 이때, weight에도 더해준다. 만약 L보다 크다면 bridge에는 0만 넣어준다. 이는 아무 트럭도 안 올라갔다는 뜻이다.
이 과정을 반복하고 bridge가 비어있다면 while문은 종료되고 총 걸린 시간이 나온다!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class BJ_13335_트럭 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
int time = 0;
int weight = 0;
st = new StringTokenizer(br.readLine());
Queue<Integer> truck = new ArrayDeque<>();
Queue<Integer> bridge = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
truck.add(Integer.parseInt(st.nextToken()));
}
for (int i = 0; i < w; i++) {
bridge.add(0);
}
while (!bridge.isEmpty()) {
time++;
weight -= bridge.poll();
if (!truck.isEmpty()) {
if (truck.peek() + weight <= L) {
weight += truck.peek();
bridge.add(truck.poll());
} else {
bridge.add(0);
}
}
}
System.out.print(time);
}
}