알고리즘

프로그래머스 스택큐 - 다리를 지나는 트럭

ghtis1798 2021. 6. 26. 15:17

🔸 문제 접근 방식

  1. truck_weights를 큐에 넣는다.
  2. bridge_length보다 작고, weight를 넘지 않으면 trcuk을 Queue에 넣는다.
  3. truck은 bridge_length + 1이 되면 Queue에서 빠져나온다.
  4. truck_weights가 비어있고, Queue에 남아 있을 경우 seconds를 증가시킨다.
  5. truck이 bridge_length +1이 되면 Queue에서 빠져나온다.

💧 Source Code

from collections import deque

def solution(bridge_length, weight, truck_weights):
    '''
    Notes: https://programmers.co.kr/learn/courses/30/lessons/42583
        1. truck_weights를 큐에 넣는다.
        2. bridge_length보다 작고, weight를 넘지 않으면 truck을 Queue에 넣는다.
        3. truck은 bridge_length가 되면 Queue에서 빠져나간다.

    Args:
        1. bridge_length (int): 다리에 올라갈 수 있는 트럭 수
        2. weight (int): 다리가 버틸 수 있는 무게
        3. truck_weights (list): 트럭 무게(int)가 담긴 리스트

    Returns:
        seconds (int): 모든 트럭이 다리를 건너는 데 걸리는 최소 시간

    '''
    truck_weights = [[truck_weight, 0] for truck_weight in truck_weights]
    truck_weights = deque(truck_weights)
    queue = deque()
    seconds = 0
    w = 0

    while truck_weights:
        seconds += 1
        if len(queue) < bridge_length and w+truck_weights[0][0] <= weight:
            truck = truck_weights.popleft()
            queue.append(truck)
            w += truck[0]

        for i in range(len(queue)):
            queue[i][1] += 1

        if queue and queue[0][1] == bridge_length:
            truck = queue.popleft()
            w -= truck[0]

    while queue:
        seconds += 1
        if queue[0][1] == bridge_length:
            truck = queue.popleft()
            w -= truck[0]

        for i in range(len(queue)):
            queue[i][1] += 1

    return seconds

def best_solution(bridge_length, weight, truck_weights):
    answer = 0
    trucks_on_bridge = [0] * bridge_length
    while len(trucks_on_bridge):
        answer += 1
        trucks_on_bridge.pop(0)
        if truck_weights:
            if sum(trucks_on_bridge) + truck_weights[0] <= weight:
                trucks_on_bridge.append(truck_weights.pop(0))
            else:
                trucks_on_bridge.append(0)
    return answer

bridge_length = 100
weight = 100
truck_weights = [10,10,10,10,10,10,10,10,10,10]
print(solution(bridge_length, weight, truck_weights))