https://programmers.co.kr/learn/courses/30/lessons/42583
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.
def solution(bridge_length, weight, truck_weights):
answer = 0
on_bridge = [0] * bridge_length
flag = len(truck_weights)
gone = []
while flag != len(gone):
answer += 1
for i in range(len(on_bridge)):
if on_bridge[i]:
if i == 0:
gone.append(on_bridge[i])
on_bridge[i] = 0
else:
on_bridge[i-1] = on_bridge[i]
on_bridge[i] = 0
if truck_weights and ((sum(on_bridge) + truck_weights[0]) <= weight):
on_bridge[-1] = truck_weights.pop(0)
return answer
이 코드는 시간 초과가 났다. 아무래도 while문 안에 for문이 문제인것같다.
그래서 곰곰히 생각해봤다. 흠....
나는 다리 길이만큼의 스택을 유지하기위해 for문으로 검사를 하고 인덱스값을 바꿔주고 했다. pop()
을 하면 다리길이가 짧아질거라는 생각에
근데 for문을 없애야 시간을 줄일 수 있으니 없는 방향으로 한번 생각해봤다.
def solution(bridge_length, weight, truck_weights):
answer = 0
on_bridge = [0] * bridge_length
while truck_weights:
answer += 1
on_bridge.pop(0)
if truck_weights and ((sum(on_bridge) + truck_weights[0]) <= weight):
on_bridge.append(truck_weights.pop(0))
else:
on_bridge.append(0)
return answer+len(on_bridge)
이걸로 통과했다. 그냥 트럭이 못들어가면 0, 아니면 트럭을 append()
시켜주고 매순간 pop()
시켜주면 다리길이는 유지되고 반복문하나가 날라가게했다.
그래서 마지막에 트럭이 다 올라가고나면 다리의 길이 + 이때까지 지난 시간을 더해 총 걸린시간을 return했다.
결국 좀 더 빠른 코드가 완성이 되었다. 문제도 통과했다. (거의 원래의 코드에서 반복문만 뺀 수준이다;;)
오늘의 교훈 : 설계를 잘하자~