문제
입력
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)
}
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 합승 택시 요금 (0) | 2024.09.27 |
---|---|
[프로그래머스] 도넛과 막대 그래프 (0) | 2024.09.23 |
[프로그래머스] 이모티콘 할인행사 (1) | 2024.09.21 |
[프로그래머스] 양궁대회 (0) | 2024.09.20 |
[프로그래머스] 거리두기 확인하기 (0) | 2024.09.19 |