https://school.programmers.co.kr/learn/courses/30/lessons/150369
코드 & 풀이
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
'프로그래머스 > Lv.2' 카테고리의 다른 글
월간 코드 챌린지 시즌1 > 삼각 달팽이 - Python, 구현 (0) | 2024.12.17 |
---|---|
연속된 부분 수열의 합 - Python, 부분합, 슬라이딩 윈도우 (0) | 2024.12.16 |
2023 KAKAO BLIND RECRUITMENT > 이모티콘 할인행사 - Python, product, 조합 (0) | 2024.11.23 |
더 맵게 - Python, heap (0) | 2024.11.16 |
프로세스 - Python, deque, sorted (1) | 2024.11.13 |