문제 링크 : programmers.co.kr/learn/courses/30/lessons/42583

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

대기중인 트럭과 다리를 지나가고 있는 트럭들은 큐에 저장하였고, 다리를 지나간 트럭들은 리스트에 저장하였다. while문에서는 먼저 지나가고 있는 트럭 중 끝에 도달한 트럭이 있으면 다리를 지나간 트럭 리스트로 옮긴다. 다리의 끝에 도달했는지 판단하는 조건은 트럭이 1초에 1만큼 움직이므로 (현재 초) - (트럭이 다리에 들어올 때 초) >= bridge_length로 하였다.

그리고 대기중인 트럭이 들어왔을 때 weight를 넘게 되면 다리를 지나가는 트럭 큐에 추가하지 않고, 넘지 않으면 추가한다. 추가하는 내용은 (트럭의 weight, 트럭이 다리를 진입할 때의 초)이다.

from collections import deque

def solution(bridge_length, weight, truck_weights):
    answer = 0
    
    num_truck = len(truck_weights)
    
    waiting_truck = deque(truck_weights) # 대기중인 트럭
    passing_truck = deque() # 다리를 지나는 트럭
    passed_truck = [] # 다리를 지난 트럭
    
    weight_sum = 0
    while len(passed_truck) < num_truck:
        answer += 1
        
        if len(passing_truck) > 0:
            first_passing_truck = passing_truck.popleft()
            
            if answer - first_passing_truck[1] >= bridge_length:
                weight_sum -= first_passing_truck[0]
                passed_truck.append(first_passing_truck[0])
            else:
                passing_truck.appendleft(first_passing_truck)
        
        if len(waiting_truck) > 0:
            cur_weight = waiting_truck.popleft()
            weight_sum += cur_weight
        
            if weight_sum <= weight:
                passing_truck.append((cur_weight, answer)) # (weight, 진입한 시점의 초)
            else:
                weight_sum -= cur_weight
                waiting_truck.appendleft(cur_weight)
        
    return answer

+ Recent posts