# 경과 시간 1 -> 다리를 지난 트럭: x / 다리를 건너는 트럭: 7
# 경과 시간 2 -> 다리를 지난 트럭: x / 다리를 건너는 트럭: x (다리가 견딜 수 있는 무게가 10까지인데 이미 7인 트럭이 건너서)
# 경과 시간 3 -> 다리를 지난 트럭: 7 / 다리를 건너는 트럭: 4
# 경과 시간 4 -> 다리를 지난 트럭: 7 / 다리를 건너는 트럭: 4, 5
# 경과 시간 5 -> 다리를 지난 트럭: 7, 4 / 다리를 건너는 트럭: 5 (다리가 견딜 수 있는 무게가 10까지인데 이미 5인 트럭이 건너서)
# 경과 시간 6 -> 다리를 지난 트럭: 7, 4, 5 / 다리를 건너는 트럭: 6
# 경과 시간 7 -> 다리를 지난 트럭: 7, 4, 5 / 다리를 건너는 트럭: 6
# 경과 시간 8 -> 다리를 지난 트럭: 7, 4, 5, 6 / 다리를 건너는 트럭: x
## 의사코드 ##
# 선입선출 -> 큐
# bridge_length만큼 0으로 채운 큐 생성 => 다리
# while 대기 트럭이 있거나 이동 중인 트럭이 있는 경우: (그냥 len(truck_weights)하면 안됨 -> truck_weights가 이동 중인 트럭이 있을 수 있기 때문에)
# 다리를 다 지난 트럭을 큐(다리)에서 꺼냄
# 다리 위에 있는 트럭 무게 = 다리 위에 있는 트럭 무게 - 다리를 다 지난 트럭 무게
# if 다리 위에 있는 트럭 무게 + 다음에 들어올 트럭 무게 <= weight: (다리 위에 있는 트럭 무게는 객체로 따로 생성)
# 다음에 들어올 트럭을 큐(다리)에 삽입
# 다리 위에 있는 트럭 무게 = 다리 위에 있는 트럭 무게 + 새로 다리에 들어온 트럭
# else:
# continue
통과한 코드
from collections import deque
def solution(bridge_length, weight, truck_weights):
answer = 0 # 시간
bridge_q = deque([0 for _ in range(bridge_length)]) # bridge_length만큼 0으로 채운 deque => 다리
sum = 0 # 다리 위에 있는 트럭 무게
# 대기 트럭이 있거나 이동 중인 트럭이 있는 동안 반복
while len(truck_weights) or sum > 0:
passed_truck = bridge_q.popleft() # 다리를 지난 트럭 꺼냄
sum -= passed_truck # 다리 위에 있는 트럭 무게 - 다리를 지난 트럭
# 새 트럭이 다리에 올라갈 수 있는 경우
if len(truck_weights) and sum + truck_weights[0] <= weight: # truck_weights에 있는 트럭의 개수와 (다리 위에 있는 트럭 무게 + 새로 들어올 트럭의 무게)가 weight 보다 작거나 같으면
new_truck = truck_weights.pop(0) # 새로 다리에 들어온 트럭
bridge_q.append(new_truck) # 다리(bridge_q)에 새로 다리에 들어온 트럭 삽입
sum += new_truck # 다리 위에 있는 트럭 무게 + 새로 다리에 들어온 트럭
# 새 트럭이 다리에 올라갈 수 없는 경우
else:
bridge_q.append(0) # 다리(bridge_q)에 0을 삽입해서 다리 길이 유지
answer += 1
return answer
-> 다리인 큐를 deque가 아니라 queue.Queue()로 변경하면 시간초과
-> 다리 위에 있는 트럭 무게를 sum()으로 구하면 시간초과 + queue.Queue()로 만들었을 때는 sum() 사용 불가
-> if문에서 'len(truck_weights) and' 없으면 IndexError 발생