백준 13335번 - 트럭
트럭 문제 바로 가기
풀이 날짜: 2026-01-29
baekjoon 알고리즘 문제 풀이
풀이 코드
from collections import deque
n,w,l = map(int, input().split())
truck = deque(map(int, input().split()))
bridge = deque([0]*w)
bridge_sum = 0
time = 0
while truck or bridge_sum > 0:
time += 1
out = bridge.popleft()
bridge_sum -= out
if truck and bridge_sum + truck[0] <= l:
t = truck.popleft()
bridge.append(t)
bridge_sum += t
else:
bridge.append(0)
print(time)
문제 핵심 요약
이 문제는 트럭이 다리를 건너는 과정을 초 단위로 시뮬레이션하는 문제다. 핵심은 다리의 길이(w)와 최대 하중(l)을 동시에 만족시키면서, 트럭들이 순서대로 이동하도록 구현하는 것이다. 트럭은 동시에 여러 대가 올라갈 수 있지만, 다리의 길이만큼 시간이 지나야 완전히 건너게 된다. 따라서 단순 계산이 아닌 시간 흐름을 그대로 구현하는 방식이 필요하다.
다리를 큐로 표현한 이유
다리는 항상 길이가 w로 고정되어 있고, 매 초마다 트럭들이 한 칸씩 앞으로 이동한다. 이 구조는 큐(Deque) 와 완벽하게 맞아떨어진다. 큐의 각 원소는 “해당 위치에 있는 트럭의 무게”를 의미하며, 트럭이 없을 경우 0을 넣어 빈 칸을 표현한다. 이렇게 하면 popleft()는 다리를 빠져나가는 트럭을, append()는 새로 진입하는 트럭(또는 빈 칸)을 의미하게 된다.
bridge_sum 변수
bridge_sum은 현재 다리 위에 올라가 있는 트럭들의 총 무게를 저장한다. 매번 다리에서 트럭이 나갈 때는 해당 무게를 빼주고, 새 트럭이 올라갈 때는 무게를 더해준다. 이 변수를 사용하면 매 초마다 다리의 무게 제한(l)을 빠르게 검사할 수 있다.
반복 조건의 핵심
이 반복 조건은 이 문제에서 가장 중요한 포인트 중 하나다. 트럭 대기열이 비어 있더라도, 이미 다리 위에 올라간 트럭이 남아 있다면 시간은 계속 흘러야 한다. 따라서
- 대기 중인 트럭이 남아 있거나
- 다리 위에 트럭이 하나라도 있으면 반복을 계속해야 한다.
매 초마다 일어나는 일의 순서
- 시간 증가
- 다리 맨 앞 칸을 popleft( ) 하여 트럭을 내보내고, 그 무게만큼 bridge_sum 감소
- 다음 트럭을 다리에 올릴 수 있는지 검사
- 가능하면 트럭을 올리고, 불가능하면 빈 칸 (0)을 추가한다.
헷갈렸던 점 정리
빈 칸(0)을 넣는 이유
트럭을 올리지 못하는 경우에도 다리는 계속 앞으로 이동해야 한다. 만약 아무 것도 넣지 않으면 다리 길이가 줄어들어 시뮬레이션이 깨진다. 따라서 트럭을 못 올리는 초에도 반드시 append(0)을 통해 시간의 흐름과 다리 이동을 정확히 표현해야 한다.