본문 바로가기
코딩 테스트

코딩 테스트(Python) 2023 KAKAO BLIND RECRUITMENT 택배 배달과 수거하기

by 우솨 2024. 12. 17.

문제 설명

당신은 일렬로 나열된 n개의 집에 택배를 배달하려 합니다. 배달할 물건은 모두 크기가 같은 재활용 택배 상자에 담아 배달하며, 배달을 다니면서 빈 재활용 택배 상자들을 수거하려 합니다.

배달할 택배들은 모두 재활용 택배 상자에 담겨서 물류창고에 보관되어 있고, i번째 집은 물류창고에서 거리 i만큼 떨어져 있습니다. 또한 i번째 집은 j번째 집과 거리 j - i만큼 떨어져 있습니다. (1 ≤ i ≤ j ≤ n)

트럭에는 재활용 택배 상자를 최대 cap개 실을 수 있습니다. 트럭은 배달할 재활용 택배 상자들을 실어 물류창고에서 출발해 각 집에 배달하면서, 빈 재활용 택배 상자들을 수거해 물류창고에 내립니다. 각 집마다 배달할 재활용 택배 상자의 개수와 수거할 빈 재활용 택배 상자의 개수를 알고 있을 때, 트럭 하나로 모든 배달과 수거를 마치고 물류창고까지 돌아올 수 있는 최소 이동 거리를 구하려 합니다. 각 집에 배달 및 수거할 때, 원하는 개수만큼 택배를 배달 및 수거할 수 있습니다.

 

def solution(cap, n, deliveries, pickups):
    answer = 0  # 총 운반 횟수를 추적하는 변수
    reverse_deliveries = deliveries[::-1]  # 배달 리스트를 역순으로 뒤집기
    reverse_pickups = pickups[::-1]  # 픽업 리스트를 역순으로 뒤집기
    d = 0  # 현재 배달량
    p = 0  # 현재 픽업량
    
    # 역순으로 처리하기 때문에 마지막부터 첫 번째까지 반복
    for i in range(n):
        d += reverse_deliveries[i]  # 현재 구간의 배달량을 더함
        p += reverse_pickups[i]  # 현재 구간의 픽업량을 더함
        
        # 배달량 또는 픽업량이 0보다 클 경우 반복
        while d > 0 or p > 0:
            d -= cap  # 배달량을 최대 용량만큼 처리
            p -= cap  # 픽업량을 최대 용량만큼 처리
            answer += (n - i) * 2  # 각 구간에서 처리할 때마다 드는 비용을 더함 (n-i) * 2는 해당 구간까지의 이동 거리
    
    return answer  # 총 이동 횟수 반환