[Programmers] 스택/큐 - 다리를 지나는 트럭

leolim·2023년 5월 26일
0

프로그래머스 고득점 키트의 level2 문제인 다리를 지나는 트럭 문제를 풀어보았다.
문제는 다음과 같다.

문제 설명
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.

예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

제한 조건
bridge_length는 1 이상 10,000 이하입니다.
weight는 1 이상 10,000 이하입니다.
truck_weights의 길이는 1 이상 10,000 이하입니다.


문제에서 시간에 관련된 내용이 언급되지 않아 헷갈렸다. 트럭이 다리를 지나는데는 몇초가 걸린다는 거지? 트럭이 다리에 올라가는데는 시간이 따로 없나? 하는 의문이 들었다.

본 문제는 출력예시를 살펴보면서, 트럭이 다리는 지나는 데는 bridge_length 초 만큼의 시간이 걸리고, 다리를 올라가는데 1초가 걸린다는 것을 파악해야한다.

스택 큐 문제이기 때문에, bridge라는 큐를 추가하고 트럭이 bridge에 올라가고 내려갈 때, total_time과 weight를 체크하면서 문제를 풀었다.

풀이는 다음과 같다.

from collections import deque


def solution(bridge_length, weight, truck_weights):
    bridge = deque()
    total_weight = 0
    time = 0
    while bridge or truck_weights:  # bridge에 트럭이 있거나, 대기 트럭이 있는 동안
        time += 1
        if bridge:  # bridge에 트럭이 있으면
            if time - bridge[0][1] >= bridge_length:  # 총경과시간에서 첫번재 시간을 뺀게 다리 길이보다 크거나 같으면 
                total_weight -= bridge.popleft()[0]  # 다리에서 내리기

        if truck_weights:  # 대기트럭이 있으면
            if total_weight + truck_weights[0] <= weight:  # 첫번째 트럭이랑 대기 중인 트럭중 첫번째를 더한 무게가 다리가 견딜 수 있는 무게보다 작으면
                truck = truck_weights.pop(0)  # 대기에서 트럭빼기
                bridge.append((truck, time))  # 트럭을 다리에 올리기
                total_weight += truck  # 무게 갱신
                
    return time```#bridge에도 트럭이 없고, 대기중인 트럭이 없다면 총 경과시간 출력


profile
Divide and Conquer

0개의 댓글