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