Algorithm/프로그래머스

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

jun_code 2025. 1. 20. 23:04

<문제>

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

<코드>

from collections import deque

def solution(bridge_length, weight, truck_weights):
    l = len(truck_weights)
    bridge = deque([0] * bridge_length)
    truck_list = deque(truck_weights)
    S, time = 0, 0
    
    while len(truck_list) !=0:
        b = bridge.popleft()
        S -= b
        if S + truck_list[0] > weight: # sum 함수에서 시간 초과 발생
            time +=1
            bridge.append(0)
        else:
            t = truck_list.popleft()
            bridge.append(t)
            S += t
            time +=1
            if len(truck_list) == 0:
                time += bridge_length
                break
    return time
    
    # while len(truck_list) !=0:
    #     bridge.popleft()
    #     if sum(bridge) + truck_list[0] > weight: # sum 함수에서 시간 초과 발생
    #         time +=1
    #         bridge.append(0)
    #     else:
    #         bridge.append(truck_list.popleft())
    #         time +=1
    #         if len(truck_list) == 0:
    #             time += bridge_length
    #             break
    # return time

 

<풀이>

  • 아래 코드는 단순히 무게에만 조건을 준 코드로 시간은 고려하지 않음
    • Ex) 다리가 견디는 최대 무게가 100일 때, 트럭 무게가 50 30 10 10 20인 순으로 갈 때, 50인 트럭이 빠지고는 20이 출발할 수 있음을 고려해야함
def solution(bridge_length, weight, truck_weights):
    on_bri_we = 0
    on_bri_tru = []
    time = 1
    for i in range(len(truck_weights)):
        w = truck_weights[i]
        on_bri_we = sum(on_bri_tru)
        if on_bri_we + w <= weight:
            if len(on_bri_tru) != 0 :
                time +=1
            on_bri_tru.append(w)
            if i == len(truck_weights)-1 :
                time +=bridge_length
        else:
            on_bri_tru = [w]
            time += bridge_length
            if i == len(truck_weights)-1 :
                time +=bridge_length
    return time
  • sum을 반복문에 사용하면 시간복잡도가 올라가서 시간초과 문제가 발생할 수 있어 sum을 반복사용하는 것이 아닌 값 자체를 바로 이용하여 sum의 시간복잡도 O(N)의 반복 막기