[프로그래머스]: 택배배달과 수거하기

아빠는 외계연·2023년 9월 8일
0

https://school.programmers.co.kr/learn/courses/30/lessons/150369?language=python3
level : 2
언어 : 파이썬
푼 시간 : 50분

첫시도

import math
def pickup(pickups,n,num):
    for i in range(num-1,-1,-1):
        if pickups[i] >= n:
            pickups[i] -= n
            return
        else:
            n -= pickups[i]
            pickups[i] = 0
            
def deliver(deliveries,n, num):
    for i in range(num-1,-1,-1):
        if deliveries[i] >= n:
            deliveries[i] -= n
            return
        else:
            n -= deliveries[i]
            deliveries[i] = 0
            
def solution(cap, n, deliveries, pickups):
    tot = 0
    for i in range(n-1,-1,-1):= math.ceil(deliveries[i] / cap)
        pick_몫 = math.ceil(pickups[i] / cap)
        tot += max(,pick_몫) * 2 * (i+1)
        deliver(deliveries, max(,pick_몫) * cap, n)
        pickup(pickups, max(,pick_몫) * cap, n)
    return tot

처음엔 몫과 나머지를 잘 조합해서 문제를 풀려 하였으나 너무 복잡해서 단순히 배달해야 할 상자를 위한 횟수와 픽업해야 할 상자를 위한 횟수의 최대값을 구하고, 해당 횟수만큼의 상자를 for문을 돌면서 빼주는 방법으로 했다.
무조건 리스트의 맨 마지막부터 상자의 개수를 빼주었기에 계속해서 필요없는 for문을 돌게 된다 -> 시간초과

두번째 시도

import math
def pickup(pickups,n,num):
    for i in range(num-1,-1,-1):
        if pickups[i] >= n:
            pickups[i] -= n
            return i + 1
        else:
            n -= pickups[i]
            pickups[i] = 0
            
def deliver(deliveries,n, num):
    for i in range(num-1,-1,-1):
        if deliveries[i] >= n:
            deliveries[i] -= n
            return i + 1
        else:
            n -= deliveries[i]
            deliveries[i] = 0
            
def solution(cap, n, deliveries, pickups):
    tot = 0
    deliver_num = n
    pickup_num = n
    for i in range(n-1,-1,-1):= math.ceil(deliveries[i] / cap)
        pick_몫 = math.ceil(pickups[i] / cap)
        tot += max(,pick_몫) * 2 * (i+1)
        if deliver_num != None:
            deliver_num = deliver(deliveries, max(,pick_몫) * cap, deliver_num)
        if pickup_num != None:
            pickup_num = pickup(pickups, max(,pick_몫) * cap, pickup_num)
    return tot
        

따라서 두번째에는 마지막으로 상자를 뺀 인덱스를 리턴값으로 받고 그 지점부터 상자의 개수를 빼도록 했다. -> 성공!

profile
Backend Developer

0개의 댓글