코테/BOJ

백준 13335 [트럭] 파이썬

동 캄 2025. 3. 3. 23:04
반응형

https://www.acmicpc.net/problem/13335

 

생각보다 시간이 오래 걸렸다. 

알고리즘은 간단한데.. 구현하는게 생각보다 어려웠다.

#백준 13335 트럭
from collections import deque
n,w,l=map(int,input().split()) # 트럭수, 통과시간, 제한하중
trucks=list(map(int,input().split())) #트럭 배열 저장
trucks=deque(trucks) # 트럭 배열 덱으로 변환
truck_on_brdg=deque([]) # 다리위에 있는 트럭 덱 초기화
ans=0 #정답 (총 시간간)
total_weight=0 # 총 무게 
def search():
    global ans
    global total_weight
    i=0
    while i<n: #모든 트럭이 통과하지 않았다면
        if total_weight+trucks[i]>l: #현재 다리위에 트럭이 있어 다음 트럭이 들어올 수 없을 때
            time_left=truck_on_brdg[0][1] #가장 앞에 있는 트럭의 남은 시간만큼 경과 시킴
            ans+=time_left
            total_weight-=truck_on_brdg[0][0] #가장 앞에 있는 트럭의 무게 만큼 총 무게에서 뺌
            truck_on_brdg.popleft() #가자 앞에 있는 트럭은 다리를 통과
            for j in range(len(truck_on_brdg)-1,-1,-1):  # 가장 앞에 있는 트럭이 다리를 통과하는데 걸리는 시간만큼 다리위의 나머지 트럭들의 남은 시간을 빼줌
                truck_on_brdg[j][1]-=time_left
            if total_weight+trucks[i]<=l: #만약 트럭이 통과하고 다음(새로운) 트럭이 들어올 수 있다면 추가
                truck_on_brdg.append([trucks[i],w])
                total_weight+=trucks[i]
                i+=1
                continue
        elif total_weight+trucks[i]<=l: #현재 다리에 다음 트럭이 들어올 수 있다면 추가
            if truck_on_brdg:
                for j in range(len(truck_on_brdg)-1,-1,-1):
                    truck_on_brdg[j][1]-=1
                if truck_on_brdg[0][1]==0:
                    total_weight-=truck_on_brdg[0][0]
                    truck_on_brdg.popleft()
            total_weight+=trucks[i]
            truck_on_brdg.append([trucks[i],w])
            ans+=1
            i+=1

search()
if truck_on_brdg: #혹시 다리위에 남은 트럭이 있다면 통과 시킴
    while truck_on_brdg:
        time_left=truck_on_brdg[0][1]
        ans+=time_left
        truck_on_brdg.popleft()
        for j in range(len(truck_on_brdg)-1,-1,-1):
            truck_on_brdg[j][1]-=time_left
print(ans)

갈길이 멀다.

 

깔끔하게 정리된 GPT의 코드를 첨부한다.

from collections import deque

def truck_on_bridge(n, w, l, trucks):
    bridge = deque([0] * w)  # 다리 길이만큼 0으로 채움
    truck_queue = deque(trucks)  # 트럭 대기열
    time = 0  # 경과 시간
    bridge_weight = 0  # 현재 다리 위 트럭 무게 합

    while bridge:  # 다리 위에 트럭이 남아있는 동안
        time += 1
        bridge_weight -= bridge.popleft()  # 다리에서 나가는 트럭 무게 제거

        if truck_queue:  # 대기 중인 트럭이 있다면
            if bridge_weight + truck_queue[0] <= l:  # 다리가 견딜 수 있는 무게 확인
                new_truck = truck_queue.popleft()  # 트럭 진입
                bridge.append(new_truck)
                bridge_weight += new_truck
            else:
                bridge.append(0)  # 다리 공간 유지 (빈 공간)

    return time

# 입력 예시
n, w, l = map(int, input().split())  # 트럭 수, 다리 길이, 최대 하중
trucks = list(map(int, input().split()))  # 트럭 무게 리스트

# 결과 출력
print(truck_on_bridge(n, w, l, trucks))

그냥 실제로 다리위에 트럭이 지나가는걸 시뮬레이션으로 구현하면 된다...

반응형