less than 1 minute read

1. 개요

2. 풀이

def solution(cap, n, deliveries, pickups):
    
    # 물건이 있거나 수거할 택배박스가 있는 위치를 뽑아낸다.
    # 인덱스 0부터 끝까지 체크해도되지만 시간복잡도를 줄이는데 도움이 되기 때문이다.
    ds = [ i for i in range(n) if deliveries[i] ] 
    ps = [ i for i in range(n) if pickups[i] ]
    
    answer = 0
    
    # 수거하거나 물건을 배달해야 한다면 반드시 트럭을 출발시킨다.
    while ds or ps:
        
        # 가장 멀리 있는 장소부터 배달하거나 수거한다.
        # 그렇게 해야만 다음에 트럭을 출발시킬때 가야하는 거리를 줄일수 있으므로 최적화가 된다.
        d, p = ds[-1] if ds else -1, ps[-1] if ps else -1
        
        dCap = pCap = cap
        
        # 수거와 배송중 가장 멀리가는거리
        # 왔다갔다해서 2번이다.
        answer += (max(d, p)+1)*2
        
        # 택배를 먼저 배송시키고
        # 돌아오면서 택배를 수거할수 있기 때문에 
        # 한번 트럭을 출발시킬때마다 cap개의 택배를 배송시키고
        # cap개의 택배를 숙거할수 있다.
        
        # 택배 배송
        while dCap and ds:
            reduced = min(deliveries[ds[-1]], dCap)
            deliveries[ds[-1]] -= reduced
            dCap -= reduced
            
            if deliveries[ds[-1]]:
                break
            ds.pop()

        # 택배 수거
        while pCap and ps:
            reduced = min(pickups[ps[-1]], pCap)
            pickups[ps[-1]] -= reduced
            pCap -= reduced

            if pickups[ps[-1]]:
                break
            ps.pop()
    
    return answer

Leave a comment