March 05, 2020
최대 10,000대의 트럭(truck_weights
)이 길이가 bridge_length
이고 무게 가용치가 weight
인 일 차선 다리를 지나간다. 트럭이 1초 당 1의 거리를 순서대로 지나갈 때, 모든 트럭이 다리를 건너려면 몇 초가 걸리는지 return 하세요.
bridge_length
는 1 이상 10,000 이하입니다.weight
는 1 이상 10,000 이하입니다.truck_weights
의 길이는 1 이상 10,000 이하입니다.from collections import deque
def solution(bridge_length: int, weight: int, truck_weights: list) -> None:
answer = 0
elapsed = 0
truck_weights = deque(truck_weights)
on_bridge = deque()
entered = deque()
while truck_weights or entered:
elapsed += 1
if entered and (elapsed - entered[0] == bridge_length):
answer = bridge_length + entered.popleft()
on_bridge.popleft()
if truck_weights and ((sum(on_bridge) + truck_weights[0]) <= weight):
on_bridge.append(truck_weights.popleft())
entered.append(elapsed)
return answer
주어진 상황이 최대 10,000대의
트럭이 지나갈 수 있다 인데, python의 기본형 배열을 사용하면 트럭이 출발, 도착할 때 배열의 index 재배열 과정에서 시간 복잡도가 크게 증가하기 때문에 메모리 사용량은 다소 올라기자만 deque를 사용하여 시간 복잡도 문제를 해결하였습니다.
import unittest
from .solution import solution
class UnitTest(unittest.TestCase):
def test_solution(self) -> None:
self.assertEqual(
solution(
bridge_length=2,
weight=10,
truck_weights=[7, 4, 5, 6],
),
8
)
self.assertEqual(
solution(
bridge_length=100,
weight=100,
truck_weights=[10],
),
101,
)
self.assertEqual(
solution(
bridge_length=100,
weight=100,
truck_weights=[
10, 10, 10, 10, 10, 10, 10, 10, 10, 10
],
),
110,
)
if __name__ == '__main__':
unittest.main()