본문 바로가기
프로그래머스/Lv.2

2023 KAKAO BLIND RECRUITMENT > 택배 배달과 수거하기 - Pyton, 구현

by 아찌방 2024. 12. 9.

 

 

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

 

프로그래머스

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

programmers.co.kr

 

코드 & 풀이

 

def solution(cap, n, deliveries, pickups):
    answer = 0
    delivery_idx, pickup_idx = n - 1, n - 1
    
    def check_endpoint(idx, task):
        while idx >= 0 and task[idx] == 0:
            idx -= 1
        return idx
    
    def move(idx, task):
        remain_cap = cap
        while remain_cap > 0 and idx >= 0:
            if task[idx] > remain_cap:
                task[idx] -= remain_cap
                return idx
            remain_cap -= task[idx]
            task[idx] = 0
            idx -= 1
        
        return idx
    
    while delivery_idx >= 0 or pickup_idx >= 0:
        delivery_idx = check_endpoint(delivery_idx, deliveries)
        pickup_idx = check_endpoint(pickup_idx, pickups)
        
        if delivery_idx < 0 and pickup_idx < 0:
            break
        
        endpoint = max(delivery_idx, pickup_idx)
        answer += (endpoint + 1) * 2
        
        delivery_idx = move(delivery_idx, deliveries)
        pickup_idx = move(pickup_idx, pickups)
    
    return answer

 

맨 끝의 집부터 검사하는 방법입니다

 

check_endpoint는 뒤에서부터 짐을 수거하고

 

갔다 돌아오기 전에

 

그 값이 0이면 안 가도 되니까

 

그걸 확인 하는 겁니다.

 

그 후 맨 끝의 집의 위치를 확인해서

 

곱하기 2한 값(왕복이니까)을 더합니다.

 

그 후 전달 및 수거를 진행하는데

 

한 번에 가지고 갈 수 있는 물품의 양 cap을

 

다 소모하는 위치를 찾아서 이동해주면 됩니다.

 

 

from itertools import zip_longest

def tolist(l):
    n=[]
    for i,d in enumerate(l):
        for _ in range(d):
            n.append(i+1)
    return n

def solution(cap, n, deliveries, pickups):
    d=tolist(deliveries)
    p=tolist(pickups)
    d.reverse()
    p.reverse()
    d=d[::cap]
    p=p[::cap]
    return 2*sum([max(x,y) for x,y in zip_longest(d,p,fillvalue=0)])

 

tolist 는

 

예를 들어, deliveries = [1, 0, 3] 일때

 

[1, 3, 3, 3] 이렇게 바꿔주는 것입니다.

 

그리고 끝에 집부터 가니까 이를 reverse() 해줍니다.

 

cap만큼 잘라가면서 이동하면서 그 집의 위치를 기록해주면 됩니다.

 

이 방식은 코드가 간결한 장점이 있으나

 

메모리를 어마 무시하게 잡아 먹습니다.

 

 

 

다음에 또 봐요

 

728x90