알고리즘

[프로그래머스] 다리를 지나는 트럭

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