[BOJ] 트럭

Minsu Han·2023년 3월 3일
0

알고리즘연습

목록 보기
91/105

코드

import sys
from collections import deque
input = sys.stdin.readline

n, w, L = map(int, input().split())
trucks = deque(list(map(int, input().split())))

# 현재 다리에 올라와 있는 트럭 무게의 합이 L을 넘지 않게 하면서 트럭을 한 칸씩 이동시킨다
bridge = deque()
time = 0
bridge.append([trucks.popleft(), w])

while bridge or trucks:
    if trucks and len(bridge) < w and sum(list(map(lambda x: x[0], bridge))) + trucks[0] <= L:
        bridge.append([trucks.popleft(), w])
    for b in bridge:
        b[1] -= 1
    if bridge[0][1] <= 0:
        bridge.popleft()
    time += 1

print(time+1)

결과

image


풀이 방법

  • 현재 다리에 올라와 있는 트럭 무게의 합이 L을 넘지 않게 하면서 트럭을 다리에 추가하고 이동시켰다
  • 이동시키는 것은 트럭을 다리에 추가할 때 남은 길이(w)를 추가정보로 저장하여 이동할 때마다 남은 길이를 1씩 줄여서 구현했다
  • 현재 다리에 있는 트럭의 총 무게에서 트럭을 더 올릴 수 있으면 올리고, 올릴 수 없으면 현재 트럭들을 한 칸 이동만 시킨다
  • 이동시킨 후 남은 길이가 0인 트럭은 다리에서 빼낸다
  • 이동시킬 때마다 time을 1씩 증가시키며 총 걸리는 시간을 계산한다.
  • 다리에 트럭이 없고, 다리를 건너기를 기다리는 트럭도 없으면 모든 트럭이 다리를 건넌 것이므로 답(time)을 출력한다.
  • while문 탈출조건을 만족할 때 실은 마지막 트럭이 다리를 벗어나게 되므로 time+1이 정답이다

profile
기록하기

0개의 댓글