알고리즘
[프로그래머스] 다리를 지나는 트럭
Dev...
2021. 5. 9. 01:41
programmers.co.kr/learn/courses/30/lessons/42583
코딩테스트 연습 - 다리를 지나는 트럭
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이
programmers.co.kr
문제를 딱 보고 다리를 건너는 트럭을 리스트로 두고 건너고 있는 거리를 잴 수 있게 똑같은 리스트 한 개를 더 만들어야겠다고 생각했다.
트럭은 두 대 이상이 동시에 다리에 오를 수 없으므로 다리의 마지막에 있는 트럭만 다리를 지났는지 검사한 후 지났다면 pop을 해준다.
그리고 다리에 트럭을 올릴 수 있는 상태라면(첫번째 대기 트럭을 올렸을 때 다리의 한계를 초과하지 않는다면) 트럭을 올린다. 그 트럭은 1만큼 건넌 것이다.
경과시간을 1 늘리고 트럭의 지나온 거리들을 1 씩 늘려준다.
대기 트럭과 건너고 있는 트럭이 모두 없을 때 까지 반복!
def solution(bridge_length, weight, truck_weights):
across = [] # 다리를 건너는 트럭을 추가할 리스트
num = [] # 다리를 건너는 트럭의 건넌 거리를 계산할 리스트
seconds = 0
while truck_weights or across: # 대기 트럭과 건너고 있는 트럭이 모두 없을 때 까지
if num and num[0] > bridge_length:
# num이 존재하고 다리의 마지막에 있는 트럭이 bridge_length를 지났을 경우
num.pop(0)
across.pop(0) # num과 across에서 0번째 값을 pop
if truck_weights and weight >= sum(across) + truck_weights[0]:
# truck_weights가 존재하고 다리에 있는 트럭의 무게의 합과 첫번째 대기 트럭의 무게를 더한 것이
# 다리의 견딜 수 있는 무게보다 작거나 같다면
across.append(truck_weights.pop(0)) # 첫번째 대기 트럭을 다리에 올림
num.append(1) # num 배열에도 1을 추가
for i in range(len(num)): # 지나고 있는 모든 트럭의 지나온 거리 + 1
num[i] += 1
seconds += 1 # 경과 시간 + 1
return seconds