import java.util.Deque;
import java.util.ArrayDeque;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int time = 0;
// 다리 위 총 무게
int bridgeWeight = 0;
// 다음에 올라갈 트럭의 index
int index = 0;
// 1. Queue 사용 (First In First Out)
// 다리 위에 있는 트럭 queue
Deque<Integer> queue = new ArrayDeque<>();
// 2. 초기 다리 상태를 0으로 채워서 다리의 길이 유지
for(int i=0; i<bridge_length; i++) {
queue.offer(0);
}
// index가 트럭 개수보다 적거나 다리 위 무게가 0보다 클 때
while(index < truck_weights.length || bridgeWeight > 0) {
time++;
// 다리 지나가면 총 무게 감소
bridgeWeight -= queue.poll();
// 새로운 트럭을 다리에 올릴 수 있는지 확인
if(index < truck_weights.length && bridgeWeight + truck_weights[index] <= weight) {
bridgeWeight += truck_weights[index];
queue.offer(truck_weights[index]);
index++;
} else {
queue.offer(0);
}
}
return time;
}
}
먼저 다리 위에 올라간 트럭이 먼저 나가야되니까 queue 사용.
ArrayDeque는 양방향 큐로 queue와 stack의 기능 모두 사용할 수 있다.
queue로 사용할 경우, queue.offer(), queue.poll()을 사용하고 stack으로 사용할 경우, stack.push(), stack.pop()을 사용한다.
다리 길이를 어떻게 유지할까 고민했는데 빈 다리에 0을 넣어서 해결했다.