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
문에서 트럭을 빼내고, 다리에 존재하는 트럭의 개수와 다리의 길이를 적절히 조합해서 "한 무리"의 트럭이 지나가는 시간을 구하고 더하는 방법으로 해결하려 했다.