-
[Algorithm: 큐] 프로그래머스 <다리를 지나는 트럭>Algorithms 2026. 5. 17. 16:26스택/큐 시뮬레이션 Java Programmers Lv.2
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42583?language=java
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
일차선 다리에 트럭이 순서대로 진입한다. 다리는 최대
bridge_length대의 트럭을 수용하고, 무게 합이weight를 초과하면 안 된다. 모든 트럭이 다리를 건너는 데 걸리는 최소 시간을 구하는 문제다.경과 시간 다리를 지난 트럭 다리 위 대기 0 [] [] [7,4,5,6] 1~2 [] [7] [4,5,6] 3 [7] [4] [5,6] 4 [7] [4,5] [6] 5 [7,4] [5] [6] 6~7 [7,4,5] [6] [] 8 [7,4,5,6] [] []
핵심 아이디어: 다리를 고정 길이 큐로 모델링
이 문제의 핵심은 다리를 길이가 고정된 큐로 표현하는 것이다. 매 초마다 큐의 앞에서 하나를 빼고 뒤에서 하나를 넣으면 다리 위 상황이 자연스럽게 시뮬레이션된다.
트럭이 없는 빈 칸을 0으로 채운다.
다리는 항상bridge_length만큼의 슬롯을 가진다.
트럭이 진입하지 못할 때 0을 넣어 슬롯을 채워야 다리 길이가 유지되고 시간 흐름이 정확해진다.bridge_length=2, weight=10, 트럭=[7,4,5,6]
초기 (t=0) 다리 비어있음 currentWeight=0t=1 진입 7 0 ←진행 4 5 6 currentWeight=7t=2 대기 7 0 ←진행 4 5 6 7+4=11 > 10 → 0 삽입t=3 진입 4 7→빠짐 ←진행 5 6 currentWeight=4t=4 진입 5 4 ←진행 6 4+5=9 ≤ 10 → 진입0을 삽입하는 이유
트럭이 진입하지 못할 때도 시간은 1초 흐른다. 빈 슬롯을 0으로 채워야 다리 앞쪽 트럭이 1칸씩 정확히 전진하고, bridge_length 이후 다리를 벗어나게 된다. 0을 넣지 않으면 다리 길이가 줄어들어 트럭이 실제보다 빨리 건너는 오류가 생긴다.종료 조건: while 루프를 언제 끝내는가
루프의 종료 조건이 조금 특별하다.
while (!waiting.isEmpty() || currentWeight > 0) {두 조건을 OR로 연결하는 이유:
waiting이 비어도 마지막 트럭이 다리를 완전히 건너는 데 시간이 더 필요하다.currentWeight > 0은 다리 위에 트럭이 남아있다는 뜻이므로, 이 조건까지 반복해야 모든 트럭이 다리를 완전히 건넌다.매 초마다 동작 흐름
1answer++— 1초가 흘렀다2다리가 가득 찼으면(bridge.size() == bridge_length) 맨 앞 값을poll()해서currentWeight에서 뺀다3다음 트럭을 올려도 무게 제한을 넘지 않으면 진입, 넘으면0을 삽입해 빈 슬롯 유지전체 시뮬레이션 — [7,4,5,6], bridge_length=2, weight=10
t=1 70 대기[4,5,6] / cW=7t=2 07 7+4=11 > 10 → 0 삽입 / 대기[4,5,6] / cW=7t=3 4 (0 빠짐) 4+5=9 ≤ 10 → 4 진입 / 대기[5,6] / cW=4t=4 54 4+5=9, 5 진입 / 대기[6] / cW=9t=5 05 (4 빠짐) 5+6=11 > 10 → 0 삽입 / 대기[6] / cW=5t=6 6 (0 빠짐) 6 진입 / 대기[] / cW=6t=7 06 (0 빠짐) 대기[] / cW=6t=8 종료 (6 빠짐) cW=0 → 루프 종료answer = 8
최종 코드
import java.util.*; class Solution { public int solution(int bridge_length, int weight, int[] truck_weights) { int answer = 0; Queue<Integer> bridge = new ArrayDeque<>(); Queue<Integer> waiting = new ArrayDeque<>(); int currentWeight = 0; for (int w : truck_weights) waiting.offer(w); // 대기 트럭이 남았거나, 다리 위에 트럭이 있으면 계속 while (!waiting.isEmpty() || currentWeight > 0) { answer++; // 1. 다리가 꽉 찼으면 맨 앞 제거 if (bridge.size() == bridge_length) { currentWeight -= bridge.poll(); } // 2. 다음 트럭 진입 가능하면 진입, 아니면 빈 슬롯(0) 삽입 if (!waiting.isEmpty() && currentWeight + waiting.peek() <= weight) { int truck = waiting.poll(); bridge.offer(truck); currentWeight += truck; } else { bridge.offer(0); // 빈 슬롯으로 시간 흐름 유지 } } return answer; } }
정리
다리 = 고정 길이 큐bridge를 큐로 모델링. 매 초 앞에서 poll, 뒤에서 offer해 1칸씩 전진을 표현.0 삽입의 역할트럭이 못 들어올 때 빈 슬롯을 0으로 채워 다리 길이와 시간 흐름을 정확히 유지.currentWeight다리 위 무게 합을 별도로 추적. poll 시 빼고 offer 시 더해 매번 큐 합산을 피함.종료 조건waiting이 비어도 currentWeight > 0이면 계속. 마지막 트럭이 다리를 완전히 건널 때까지.이 문제의 핵심은 다리를 큐로 추상화하는 발상이다.
물리적인 다리의 "밀려나감"을 poll/offer로 자연스럽게 표현하고,
빈 슬롯을 0으로 채우는 방법으로 시간 흐름과 다리 길이를 동시에 관리한다.* 이 포스팅은 Claude AI의 도움을 받아서 작성되었습니다.
'Algorithms' 카테고리의 다른 글
[Algorithm: 그래프] 프로그래머스 <순위> (0) 2026.06.04 [Algorithm: 해시] 프로그래머스 <의상> (0) 2026.05.18 [Algorithm: 큐] 프로그래머스 <프로세스> (0) 2026.05.17 [Algorithm: DFS] 프로그래머스 <퍼즐 조각 채우기> (0) 2026.05.13 [Algorithm: DFS] 프로그래머스 <단어 변환> (0) 2026.05.02