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

CHOI YUN HO·2021년 3월 28일
0

알고리즘 문제풀이

목록 보기
16/63

📃 문제 설명

다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.

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

경과 시간다리를 지난 트럭다리를 건너는 트럭대기 트럭
0[][][7,4,5,6]
1~2[][7][4,5,6]
3[7][4][5,6]
4[7][4,5][6]
5[7,4][5][6]
6~7[7,4,5][6][]
8[7,4,5,6][][]

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

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

제한사항

  • bridge_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.

[문제 출처 : 프로그래머스]

👨‍💻 해결 방법

나의 생각의 흐름을 주절주절..

큐를 이용하여 다리 위에 있는 트럭을 저장할 것인데
트럭에 1초에 1씩 움직인다는 것을 구현하기 위해서,
나는 시간을 1초씩 계속 증가시키고,
트럭이 다리에 올라갈 수 있을 때는 트럭의 무게를 push하고,
그렇지 않을 때는 0을 push한다.

트럭이 다리위에 올라갈 수 있는지 판단하기 위해서,
큐의 모든 값을 더해서 weight보다 같거나 작을 때만 올라간다.

그리고 큐의 길이가 다리의 길이만큼 되면 pop을 한다.

이렇게 하면 트럭이 1초에 1씩 움직여서 길이만큼 움직이면 큐에서 빠져나가게 되고, 그에 따른 무게변화에 맞게 새로운 트럭이 큐에 올라간다.

대기 트럭의 마지막 트럭이 다리에 올라가는 순간 반복문을 종료하고,
다리의 길이 만큼 시간에 더해주면 그것이 문제가 요구하는 정답이다.

결론

다리를 건너는 트럭은 큐에 push,
큐의 합을 이용해 다음 트럭이 다리에 오를 수 있는지 판단한다.

다리에 오를 수 없다면 0을 push하여 시간의 흐름을 구현했다.

큐의 길이가 다리 길이와 같아지면 pop한다.

대기 트럭의 마지막 트럭이 큐에 push되면 시간에 다리 길이만큼을 더하고 종료.

👨‍💻 소스 코드

from collections import deque


def solution(bridge_length, weight, truck_weights):
    answer = 0
    queue = deque()

    i = 0
    while i < len(truck_weights):
        if len(queue) == bridge_length:
            queue.popleft()
        if not queue or sum(queue) + truck_weights[i] <= weight:
            queue.append(truck_weights[i])
            i += 1
        else:
            queue.append(0)
        answer += 1
    answer += bridge_length
    return answer
profile
가재같은 사람

0개의 댓글