본문 바로가기
알고리즘 문제/프로그래머스_Lv2 도장깨기

[프로그래머스] 다리를 지나는 트럭 (Python)

by 스코필 2024. 3. 21.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

트럭 여러 대가 순서대로 최단 시간 안에 다리를 건너려고 합니다. 모든 트럭이 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이 때 모든 트럭이 다리를 건러려면 최소 몇 초가 걸리는 지 return 하는 문제이다.

제한 조건

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

 

풀이

bridge_length = 2, weight = 10, truck_weights = [7, 4, 5, 6] 을 예로 들면, 아래와 같이 진행된다.

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

 

❌ Code - 실패

from collections import deque

def solution(bridge_length, weight, truck_weights):
    time = 0
    bridge = deque([0] * bridge_length)
    truck_weights = deque(truck_weights)
    
    while truck_weights or bridge:
        time += 1
        bridge.popleft()
        
        if truck_weights:
            if sum(bridge) + truck_weights[0] <= weight:
                bridge.append(truck_weights.popleft())
            else:
                bridge.append(0)
    
    return time

 

sum()을 사용했을 때, 테스트 케이스 5번이 시간 초과가 나왔다. (bridge 리스트의 크기가 커졌을 때 발생하는 에러로 추정)

그래서 sum()을 사용하지 않고, 건너는 다리의 무게 변수를 생성하여 에러를 해결했다.

 

✅ Code - 성공

from collections import deque

def solution(bridge_length, weight, truck_weights):
    time = 0
    bridge = deque([0] * bridge_length)
    truck_weights = deque(truck_weights)
    
    current_bridge_weight = 0
    while truck_weights or bridge:
        time += 1
        
        current_bridge_weight -= bridge.popleft()
        
        if truck_weights:
            if current_bridge_weight + truck_weights[0] <= weight:
                truck_weight = truck_weights.popleft()
                bridge.append(truck_weight)
                current_bridge_weight += truck_weight
                
            else:
                bridge.append(0)
    
    return time