PS/프로그래머스

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

Hamp 2024. 9. 22. 14:52
반응형

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

입력

cap:Int = 한번에 들고있을 수 있는 상자 용량
n:Int = 집 개수 
deliveries:[Int]: (index+1) 번째 집에 배달해야하는 상자 개수
pickups:[Int] : (index+1) 번째 집에 수거해야하는 상자 개수

출력

dist: Int64 = 모든 작업을 완료했을 때 최소 이동거리

해석

최소 이동거리이므로 오른쪽에 있는 집쪽을 먼저 해결해야 거리가 줄어든다.

 

1. 만약 배달 또는 수거해야하는 상자가 하나라도 있으면 무조건 방문해야함

2. 한번 왕복할 때 거리 = (방문한 집의 가장 오른쪽 집 인덱스 +1) *2

3. 배달 또는 수거할 때마다 "cap" 만큼하게 되면 왕복 횟수 자체가 줄어들게된다.

4. 즉, 배달 수거를할 때마다 돌아왔을 대는 0보다 작거나 작아야한다. 작다는 것은 이전 왕복에 수행했다는 것

코드

import Foundation

func solution(_ cap:Int, _ n:Int, _ deliveries:[Int], _ pickups:[Int]) -> Int64 {

    var del: Int = 0
    var pic: Int = 0
    var dist: Int = 0 
    
    for index in stride(from:n-1, through:0, by: -1) {
        
        del += deliveries[index] 
        pic += pickups[index] 
        
        while del > 0 || pic > 0 { // 들고있는게 있다면 (배달 or 수거 해야할것)
            dist += (index+1) * 2 // 왕복 거리 
            // 한번 왕복마다 cap 만큼 뺀다.
            del -= cap 
            pic -= cap 
            // 음수가 되도 되는 이유는 다음 왕복 때 추가가되었는데 그게 0 이하면 이전 왕복 때 했다고 생각할 수 있다.
        }
    }
    return Int64(dist)
}
반응형