eaz_algorithm
[Programmers] 다리를 지나는 트럭
eaz_silver
2024. 3. 19. 23:15
문제
요약
길이가 length인 다리가 최대 weight 무게를 견딜 수 있을 때,
truck_weights의 트럭들이 모두 다리를 건너려면 얼마나 걸리는가
풀이
풀이1(오답)
첫번째 풀이의 접근 자체는 나쁘지 않았던 것 같다.
현재 다리 위의 트럭들의 무게와 새로 들어오는 트럭의 합이 기준보다 초과일때,
제일 앞에 있는 트럭이 다리를 다 지날 때까지는 진입을 못한다.
마지막 트럭이 다리 위에 올라오고 나서는 다리 길이만큼 시간이 더 걸리기 때문에 마지막에 다리길이를 한번더 더해준다.
이 풀이는 다리 중간 쯤까지 차가 이동해 있었을 경우를 파악하지 못한다.
from collections import deque
def solution(bridge_length, weight, truck_weights):
answer = 0
head = 0
q = deque([])
for truck in truck_weights:
if sum(q) + truck > weight:
answer += bridge_length
q.popleft()
else:
answer += 1
q.append(truck)
while len(q) > bridge_length:
q.popleft()
answer += 1
return answer+bridge_length
풀이2(정답)
무게를 초과할 때 무게 대신 0을 추가하는 것까지는 파악했는데 그 뒤로 계속 풀리지 않았다.
그리고 나서는 total로 무게를 그때그때 구하는 것 대신 sum(bridge)를 사용했다가 시간초과가 발생했다.
deque여부와 상관 없이 sum은 리스트 길이 n만큼 O(n)의 시간이 걸리기 때문에 시간 초과가 된다.
오늘도 하나 알아가는 하루 :)
from collections import deque
def solution(length, weight, truck_weights):
answer = 0
trucks = deque(truck_weights)
bridge = deque([0] * length)
total = 0
while len(trucks):
t = bridge.popleft()
answer += 1
total -= t
if total + trucks[0] > weight:
bridge.append(0)
else:
t = trucks.popleft()
bridge.append(t)
total += t
return answer+length