💬 문제
택배 배달과 수거하기
💬 Idea
아이디어: 가장 먼 곳으로부터 cap개를 포함할 수 있을만큼 택배를 갖고 출발하여 가장 먼 곳부터 택배를 배달하고, 오는 길에 택배를 수거할 수 있을만큼 최대로 수거하자.
- stack 2개를 사용한다 → 배달 스택 / 수거 스택
- 가장 가까운 집의 배달, 수거 정보부터 스택에 저장해둔다.
- 배달 스택과 수거 스택의 가장 위 요소들의 인덱스 정보를 비교하여 가장 먼 거리까지 이동한다.
- 이후 배달 스택이 비어있지 않으면서 이번에 배달가능한 개수일때까지 배달 스택을 돌며 배달 가능한 집에 배달을 한다.
- 수거도 동일.
- 위 과정을 스택이 빌 때까지 반복한다.
💬 풀이
func solution(cap:Int, n:Int, deliveries:[Int], pickups:[Int])->Int64{vardeliverStack:[(Int,Int)]=[]varpickupStack:[(Int,Int)]=[]vardistance=0foriin0..<n {ifdeliveries[i]!=0{
deliverStack.append((i,deliveries[i]))}ifpickups[i]!=0{
pickupStack.append((i,pickups[i]))}}while !deliverStack.isEmpty || !pickupStack.isEmpty {letdeliverLastIdx= deliverStack.last?.0??0letpickupLastIdx= pickupStack.last?.0??0
// 거리 계산 (왕복)
if deliverLastIdx > pickupLastIdx {
distance +=(deliverLastIdx +1)*2}else{
distance +=(pickupLastIdx +1)*2}vardeliverBox= cap
varpickupBox= cap
while deliverBox >0 && !deliverStack.isEmpty {if deliverBox -(deliverStack.last?.1??0)<0{deliverStack[deliverStack.count -1].1-= deliverBox
break}else{
deliverBox -= deliverStack.popLast()?.1??0}}while pickupBox >0 && !pickupStack.isEmpty {if pickupBox -(pickupStack.last?.1??0)<0{pickupStack[pickupStack.count -1].1-= pickupBox
break}else{
pickupBox -= pickupStack.popLast()?.1??0}}}returnInt64(distance)}
💬 문제택배 배달과 수거하기
💬 Idea아이디어: 가장 먼 곳으로부터 cap개를 포함할 수 있을만큼 택배를 갖고 출발하여 가장 먼 곳부터 택배를 배달하고, 오는 길에 택배를 수거할 수 있을만큼 최대로 수거하자.
💬 풀이