백준 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)을 빠르게 검사할 수 있다.


반복 조건의 핵심

이 반복 조건은 이 문제에서 가장 중요한 포인트 중 하나다. 트럭 대기열이 비어 있더라도, 이미 다리 위에 올라간 트럭이 남아 있다면 시간은 계속 흘러야 한다. 따라서

  • 대기 중인 트럭이 남아 있거나
  • 다리 위에 트럭이 하나라도 있으면 반복을 계속해야 한다.

매 초마다 일어나는 일의 순서

  1. 시간 증가
  2. 다리 맨 앞 칸을 popleft( ) 하여 트럭을 내보내고, 그 무게만큼 bridge_sum 감소
  3. 다음 트럭을 다리에 올릴 수 있는지 검사
  4. 가능하면 트럭을 올리고, 불가능하면 빈 칸 (0)을 추가한다.

헷갈렸던 점 정리

빈 칸(0)을 넣는 이유

트럭을 올리지 못하는 경우에도 다리는 계속 앞으로 이동해야 한다. 만약 아무 것도 넣지 않으면 다리 길이가 줄어들어 시뮬레이션이 깨진다. 따라서 트럭을 못 올리는 초에도 반드시 append(0)을 통해 시간의 흐름과 다리 이동을 정확히 표현해야 한다.