[BOJ/python] 13335: 트럭

songeunm·2024년 8월 24일

PS - python

목록 보기
1/62

문제
silver 1 / 구현, 자료구조, 시뮬레이션, 큐

다시 문제를 풀기 시작했다.
오랜만에 이런 문제풀기 코드를 짜려니 문제를 봤을 땐 쉽네! 한 것도 잘 풀리지 않았다.
역시 꾸준함이 답이라는걸 다시 한번 느낀다.

흐름은 이렇다.

  1. 현재 큐에 들어있는 이동할 트럭들을 1칸씩 이동시킨다.
    a-1) 업데이트된 트럭이 다리를 모두 건넜다면 현재 하중에서 트럭의 무게를 빼준다.
    a-2) 다리를 모두 건넌 현재 트럭이 마지막 트럭이라면 doneTrue로 설정하여 while문을 종료한다.
    b) 업데이트된 트럭이 다리를 모두 건너지 않았다면 다시 큐에 넣어 다음 차례에 이동하도록 한다.
  2. 제한 하중을 넘지 않고, 다리가 꽉 차지 않았다면 다음 차례의 트럭을 큐에 넣고, 위치와 무게도 바로 함께 업데이트시켜준다.
import sys
from collections import deque
from time import sleep

input = sys.stdin.readline

def cross_bridge(w: int, L: int, trucks: list):
    q = deque([])

    time = 0
    i = 0
    n = len(trucks)
    locations = [0 for _ in range(n)]
    weight = 0
    done = False

    while not done:
        # 큐의 트럭 이동
        for _ in range(len(q)):
            idx = q.popleft()
            locations[idx] += 1
            if locations[idx] > w:
                weight -= trucks[idx]
                if idx == n-1:
                    done = True
            else:
                q.append(idx)

        # 제한 하중을 넘지 않고, 다리가 꽉 차지 않은 경우 다음 트럭 출발
        if i < n:
            if weight+trucks[i] <= L and len(q) < w:
                q.append(i)
                locations[i] += 1
                weight += trucks[i]
#                print(f"{i}번째 트럭 출발!")
                i += 1

#        print(f"time {time}: {locations}, weight: {weight}")
#        sleep(0.1)
        
        time += 1

    return time

if __name__ == "__main__":
    n, w, L = map(int, input().split())
    trucks = list(map(int, input().split()))

    print( cross_bridge(w, L, trucks) )
    ```
profile
데굴데굴 구르는 개발자 지망생

0개의 댓글