[알고리즘][X] 다리를 지나는 트럭

2023. 6. 11. 14:02알고리즘 풀이

문제 설명
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 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 이하입니다.
입출력 예
bridge_length	weight	truck_weights	return
2	10	[7,4,5,6]	8
100	100	[10]	101
100	100	[10,10,10,10,10,10,10,10,10,10]	110
출처

※ 공지 - 2020년 4월 06일 테스트케이스가 추가되었습니다.

나의 풀이(틀린 풀이)

왜 틀렸을까?

- 트럭은 교량에서 한번에 빠지는 것이 아니라 하나씩 빠진다. 이를 간과했다.

무엇을 배웠는가?

- 문제를 풀며 어려움이 있었던 부분은 이걸 어떻게 시뮬레이션할까였다. 

- 딕셔너리 형태이든지 리스트 형태이든지 만들면 매 step마다 갱신할 때 for문 전체를 훑어야하는 비효율이 있었다.

- deque을 사용하여 pop을 하면 이게 쉽게 가능해진다는 것을 배웠다.

- 시뮬레이션 문제에서의 선택의 폭이 하나 더 생겼다.

def solution(bridge_length, weight, truck_weights):
    1_05
    1_25
    total_time = 0
    total_weight = 0
    on_bridge = 0
    for truck in truck_weights:
        temp_total_weight = total_weight + truck
        temp_on_bridge = on_bridge + 1
        if temp_total_weight > weight or temp_on_bridge > bridge_length :
            total_time += bridge_length + on_bridge - 1
            on_bridge = 1
            total_weight = truck
        else:
            total_weight = temp_total_weight
            on_bridge = temp_on_bridge
            
    total_time += bridge_length + on_bridge
    
    return total_time

정답 풀이(https://school.programmers.co.kr/learn/courses/30/lessons/42583/solution_groups?language=python3)

from collections import deque

def solution(bridge_length, weight, truck_weights):
    bridge = deque(0 for _ in range(bridge_length))
    total_weight = 0
    step = 0
    truck_weights = deque(truck_weights)

    while truck_weights:
        total_weight -= bridge.pop()
        if total_weight + truck_weights[0] > weight:
            bridge.appendleft(0)
        else:
            truck = truck_weights.popleft()
            bridge.appendleft(truck)
            total_weight += truck
        step += 1

    step += bridge_length

    return step

'알고리즘 풀이' 카테고리의 다른 글

[알고리즘] k번째 수  (0) 2023.06.13
[알고리즘] 주식가격  (0) 2023.06.12
[알고리즘] 프로세스  (1) 2023.06.09
[알고리즘] 올바른 괄호  (0) 2023.06.08
[알고리즘][X] 기능개발  (0) 2023.06.08