🍀 문제
👊🏻 택배 배달과 수거하기 > https://school.programmers.co.kr/learn/courses/30/lessons/150369
👻 문제 풀이
1️⃣ 가장 먼 집부터 방문해야한다. <- 그리디
have_to_delivery = 0 # 배달해야 할 박스의 개수
have_to_pickup = 0 # 수거해야 할 박스의 개수
for i in range(n):
# 먼 곳부터 방문
have_to_delivery += deliveries.pop()
have_to_pickup += pickups.pop()
2️⃣ "트럭에 실은 박스의 수 - 트럭에 실을 수 박스의 개수" <= 0 이면 트럭에 박스를 더 실을 수 있다는 것이다.
( have_to_delivery 및 have_to_pickup 변수가 0과 같거나 작다면, 용량 보다 적은 양을 싣고 있는 것이므로 다른 집도 방문할 수 있음)
그러므로 양수인 경우에만 result에 이동거리 * 2 를 저장해준다. (집을 방문하면 택배회사 내려놓으러 가야하므로 왕복 거리로 계산)
while have_to_delivery > 0 or have_to_pickup > 0:
have_to_delivery -= cap
have_to_pickup -= cap
result += (n - i) * 2
❓ while문의 조건을 "배달해야 할 박스의 수 - 트럭에 실을 수 박스의 개수" > 0 or "수거해야 할 박스의 수 - 트럭에 실을 수 박스의 개수" > 0 으로 설정한 이유
: 배달 혹은 수거해야할 상자가 하나라도 남아있으면 무조건 방문해야하기 때문이다.
👩🏻💻 전체코드
def solution(cap, n, deliveries, pickups):
result = 0 # 최소 이동 거리
have_to_delivery = 0 # 배달해야 할 박스의 개수
have_to_pickup = 0 # 수거해야 할 박스의 개수
for i in range(n):
# 먼 곳부터 방문
have_to_delivery += deliveries.pop()
have_to_pickup += pickups.pop()
# print(f'------- {i}번째 집-------')
# print(f'{have_to_delivery}개 배달해야함')
# print(f'{have_to_pickup}개 수거해야함')
while have_to_delivery > 0 or have_to_pickup > 0:
# print(f'{i}번째 집 방문')
have_to_delivery -= cap
have_to_pickup -= cap
result += (n - i) * 2
return result
'알고리즘' 카테고리의 다른 글
[프로그래머스 / Python] 요격 시스템 (0) | 2023.07.15 |
---|---|
[프로그래머스 / Python] 오픈채팅방 (0) | 2023.07.07 |
[프로그래머스 / Python] 개인정보 수집 유효기간 (0) | 2023.06.24 |
[BOJ / Python] 14719 빗물 (0) | 2023.06.20 |
[프로그래머스 / Python] 햄버거 만들기 (0) | 2023.06.17 |