다리길이만큼 deque
을 만들어서 트럭이 한 칸씩 왼쪽(←) 방향으로 움직인다.
예를 들어
걸린 시간 | 다리를 지난 트럭 | 다리를 지나고 있는 트럭 | 대기중 |
---|---|---|---|
0초 | [] | [0, 0] | [7, 4, 5, 6] |
1초 | [] | [0, 7] | [4, 5, 6] |
2초 | [] | [7, 0] | [4, 5, 6] |
3초 | [7] | [0, 4] | [5, 6] |
4초 | [7] | [4, 5] | [6] |
5초 | [7, 4] | [5, 0] | [6] |
6초 | [7, 4, 5] | [0, 6] | [] |
7초 | [7, 4, 5] | [6, 0] | [] |
8초 | [7, 4, 5, 6] | [0, 0] | [] |
[0, 0]
에서 0
번째 값을 빼준다. (popleft()
)pop(0)
vs popleft()
시간 복잡도
list.pop(0)
- O(n)
deque.popleft()
- O(1)
sum()
의 시간복잡도는 O(n)
-> 생각보다 오래 걸린다. (시간초과)
O(n)
(n
== 트럭의 수)from collections import deque
def solution(bridge_length, weight, truck_weights):
answer = 0
bridge = deque([0] * bridge_length)
truck_weights = deque(truck_weights)
current_weight = 0 # 현재 다리위에 있는 트럭들의 무게
# 다리를 다 지날때까지 반복
while len(bridge):
# 한칸씩 땡기기(<-)
current_weight -= bridge.popleft()
# 대기중인 트럭이 있다면
if truck_weights:
# 다리에 지날 수 있으면 빼기
if current_weight + truck_weights[0] <= weight:
current_weight += truck_weights[0]
bridge.append(truck_weights.popleft())
# 같이 지날 수 없으면 대기
else:
bridge.append(0)
# 시간
answer += 1
return answer