from collections import deque
def solution(bridge_length, weight, truck_weights):
truck = deque(truck_weights) # 대기 중인 트럭 리스트를 deque로 변환
# 초기 다리 상태 설정: 길이만큼 0으로 채운 deque 생성
bridge = [0] * (bridge_length - 1)
bridge = deque(bridge)
# 첫 번째 트럭을 다리에 올리고, 다리의 총 무게를 갱신
bridge.append(truck.popleft())
weight_bridge = sum(bridge)
# 경과 시간 초기화
answer = 1
# 대기 트럭이 있을 때 반복
while truck:
t = truck.popleft() # 대기 트럭 중 맨 앞 트럭을 가져옴
while True:
# 다리의 첫 번째 칸에서 트럭을 내보냄
weight_bridge -= bridge.popleft() # 다리의 총 무게에서 해당 트럭 무게를 뺌
# 현재 트럭을 올렸을 때 다리 무게를 초과하면 빈 공간 추가
if weight_bridge + t > weight:
bridge.append(0) # 빈 공간 추가
answer += 1 # 시간 증가
else:
# 현재 트럭을 다리에 올림
bridge.append(t)
weight_bridge += t # 다리의 총 무게 갱신
answer += 1 # 시간 증가
break # 다리에 트럭을 올렸으므로 루프 종료
# 마지막 트럭이 다리를 건너는 데 걸리는 시간 추가
answer += len(bridge)
return answer
풀이
트럭들이 다리를 건너는 데 걸리는 시간을 계산하는 문제다.
입력받은 트럭 무게 리스트를 deque로 변환해 사용했고, 다리는 bridge_length만큼의 길이를 가진다. 초깃값은 모두 빈 공간(0)으로 채워진 상태로 두고, 대기 트럭 중 첫 번째 트럭을 다리에 올리고, 다리 위에 있는 트럭들의 총 무게를 나타내는 weight_bridge 값을 첫번째 트럭의 무게로 두었다. 또한, 트럭이 다리에 오르면서 시간이 1초 흐르도록 처리했다.
대기 트럭에서 하나씩 꺼내어 다리에 올릴 수 있는지 확인하는데, 트럭이 다리에 올라갈 수 있는 경우엔 다리의 첫 번째 칸에서 트럭을 내리고, 무게를 갱신한다. 새 트럭을 다리에 추가하고, 다리 위의 총 무게도 갱신 + 시간 1초 증가시킨 뒤 다음 트럭으로 넘어간다.
다리에 올라갈 수 없는 경우빈 공간(0)을 추가하며 시간을 1초씩 증가시킨다.
마지막으로는 모든 트럭이 다리에 올라가고, 남은 트럭들이 다리를 완전히 건너는 데 걸리는 시간을 다리의 길이만큼 추가한다.