
https://www.acmicpc.net/problem/13335
import java.util.*;
import java.io.*;
//4 2 10
//7 4 5 6
//-> 8
class Main {
public static void main(String[] args) throws Exception {
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()); // 다리의 최대 하중
st = new StringTokenizer(br.readLine());
Queue<Integer> trucks = new LinkedList<>();
for (int i = 0; i < N; i++) {
trucks.add(Integer.parseInt(st.nextToken()));
}
Queue<Integer> bridge = new LinkedList<>();
for (int i = 0; i < W; i++) {
bridge.add(0);
}
int time = 0;
int weightOnBridge = 0;
while (!bridge.isEmpty()) {
time++;
weightOnBridge -= bridge.poll();
//트럭이 비어있으면 건너뜀
if(trucks.isEmpty()) {
continue;
}
// 만약 다리 위를 트럭이 지나갈 수 있으면
if (trucks.peek() + weightOnBridge <= L) {
//트럭큐에서 트럭 한개를 꺼내서 다리큐에 놓고, 현재 다리에 있는 트럭 무게 갱신
int cur = trucks.poll();
weightOnBridge += cur;
bridge.add(cur);
}else {
//지나갈 수 없으면 0 삽입
bridge.add(0);
}
}
System.out.println(time);
}
}
트럭 개수, 다리 길이, 다리의 최대 하중이 주어지고, 다음 라인에 각 트럭의 무게들이 주어진다.트럭을 답고 있는 큐 하나, 각 시간별 다리의 상황을 답고 있는 큐 하나 총 두개를 사용하였다.
bridge큐에는 현재 건너고 있는 트럭의 무게가 위치별로 들어있으며, 아무 트럭도 존재하지 않는 위치에는 0이 들어있다.
while문 내부 로직은 다음과 같다.
weightOnBridge변수에서 그 값을 뺸다.weightOnBridge의 합이 L보다 작다면 트럭이 다리를 건널 수 있는 상황이다. 따라서 트럭큐에서 트럭을 제거하고, weightOnBridge를 갱신한다.bridge에 0값을 추가한다.bridge큐를 활용하고, 만약 트럭을 추가할 수 있으면 그 값을 추가하고 없으면 0을 추가한다. bridge가 현재 다리의 상태를 나타내게 된다.W를 초과하지 않게 된다. bridge큐를 사용하지 않았다.while문에서 트럭을 빼내고, 다리에 존재하는 트럭의 개수와 다리의 길이를 적절히 조합해서 "한 무리"의 트럭이 지나가는 시간을 구하고 더하는 방법으로 해결하려 했다.