Algorithm

Python 알고리즘 끄적끄적

jun_code 2025. 1. 20. 23:09

시간초과 발생 요인

반복적인 SUM

  • 문제 참고 : 스택/큐 - 다리를 지나는 트럭 (프로그래머스)
  • sum은 시간복잡도가 O(N)인데 반복문 for이나 while을 사용하면 시간복잡도가 O(n^2)이 될 수 있음
  • 아래 예시는 sum으로 인해 시간초과가 발생한 경우로 sum을 반복적으로 하는 것이 아닌 계산된 값을 이용
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
  • 시간초과가 발생한 코드
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

 


STACK / QUEUE

길 건너기, 

  • 문제 참고 : 스택/큐 - 다리를 지나는 트럭 (프로그래머스)
  • 위치 A, 길(다리), 위치 B가 있고 위치 A에서 위치 B로 갈 때, 길(다리)를 이용하는 경우 queue를 이용하여 해결
  • 길(다리)를 list가 아닌 queue로 만들어 pop, append로 대상이 지나가고 추가되는 역할을 함
    • 아래 예시는 다리를 queue로 만들어 트럭 지나가는 경우 pop, 새로운 트럭이 다리위로 올라오면 append
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