https://programmers.co.kr/learn/courses/30/lessons/42583
다리에 올라갈 수 있는 트럭 수 bridge_length
다리가 견딜 수 있는 무게 weight
트럭 별 무게 truck_weights
모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 반환하는 문제입니다.
경과 시간 | 다리를 지난 트럭 | 다리를 건너는 트럭 | 대기 트럭 |
---|---|---|---|
0 | [] | [] | [7,4,5,6] |
1~2 | [] | [7] | [4,5,6] |
3 | [7] | [4] | [5,6] |
4 | [7] | [4,5] | [6] |
5 | [7,4] | [5] | [6] |
6~7 | [7,4,5] | [6] | [] |
8 | [7,4,5,6] | [] | [] |
입출력 예
bridge_length | weight | truck_weights | return |
---|---|---|---|
2 | 10 | [7,4,5,6] | 8 |
100 | 100 | [10] | 101 |
100 | 100 | [10,10,10,10,10,10,10,10,10,10] | 110 |
큐
를 이용해 접근했습니다.
빈 도로는 0
으로 채워 표현하였고 도로의 원소가 없어질 때 까지 시간증가와 popleft()
를 반복합니다.
이 때 다리에 있는 트럭의 무게와 들어올 트럭의 무게를 합한 것이 견딜 수 있는 무게보다 작은지 확인해서 작거나 같다면 트럭을 다리에 올리고 크다면 0
을 append
합니다.
시간초과
from collections import deque
def solution(bridge_length, weight, truck_weights):
time = 0
truck_weights = deque(truck_weights)
bridge = deque([0] * bridge_length)
bridge_weight = 0
while(bridge):
time += 1
bridge.popleft()
if truck_weights:
if sum(bridge) + truck_weights[0] <= weight:
bridge.append(truck_weights.popleft())
else:
bridge.append(0)
return time
5번 테스트 케이스에서 시간초과가 낫습니다.
아무래도 다리에 있는 트럭의 무게를 구하기 위해 sum()
을 사용했는데 시간복잡도가 O(n)
이다 보니 도로의 길이가 길어질 경우 시간초과가 나는 것 같습니다.
따라서 sum
을 사용하지 않고 별도의 변수 bridge_weight
를 만들어 해결했습니다.
최종 코드
from collections import deque
def solution(bridge_length, weight, truck_weights):
time = 0
truck_weights = deque(truck_weights)
bridge = deque([0] * bridge_length)
bridge_weight = 0
while(bridge):
time += 1
bridge_weight -= bridge.popleft()
if truck_weights:
if bridge_weight + truck_weights[0] <= weight:
truck = truck_weights.popleft()
bridge.append(truck)
bridge_weight += truck
else:
bridge.append(0)
return time