알고리즘 & 자료구조/문제 풀이
[프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 다리를 지나는 트럭
수수다
2026. 7. 29. 02:07
https://school.programmers.co.kr/learn/courses/30/lessons/42583
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 핵심
- 트럭은 1초에 1칸씩 이동 (지문엔 명시 안 되어 있고, 예시 표로 유추해야 함)
- 트럭 1대가 다리를 완전히 통과하는 데 정확히 bridge_length초 소요
- 다리 위 트럭들의 무게 합이 weight를 넘으면 안 됨 (대기 중인 트럭 무게는 무시)
풀이 전략
- 큐 2개로 관리: waitingQ(아직 다리에 안 오른 트럭), bridgeQ(현재 다리 위 트럭, {진입시각, 무게} 저장)
- time을 1씩 증가시키며 매초 두 단계를 순서대로 체크
- 내리기: bridgeQ 맨 앞 트럭의 진입시각 + bridge_length == time이면 다리에서 빼고 무게 차감
- 태우기: waitingQ 맨 앞 트럭을 태워도 totalWeight + 무게 <= weight면 태우고 무게 누적
- waitingQ와 bridgeQ가 둘 다 빌 때까지 반복, 최종 time이 정답
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> waitingQ = new ArrayDeque<>();
Queue<int[]> bridgeQ = new ArrayDeque<>();
for(int t : truck_weights) {
waitingQ.add(t);
}
int time = 0;
int totalWeight = 0;
while(!waitingQ.isEmpty() || !bridgeQ.isEmpty()) {
time++;
if(!bridgeQ.isEmpty()) {
int[] bridgeTruck = bridgeQ.peek();
if(bridgeTruck[0] + bridge_length == time) {
bridgeQ.poll();
totalWeight -= bridgeTruck[1];
}
}
if(!waitingQ.isEmpty()) {
int waitingTruck = waitingQ.peek();
if(totalWeight + waitingTruck <= weight && bridgeQ.size() < bridge_length) {
waitingQ.poll();
bridgeQ.add(new int[] {time, waitingTruck});
totalWeight += waitingTruck;
}
}
}
return time;
}
}
