728x90
https://school.programmers.co.kr/learn/courses/30/lessons/150369
이 문제는 가장 먼 거리를 먼저 끝내면 된다! 가장 먼 거리는 한 번만 가도록 한다. (최소 거리를 위해)
일단 이 문제는 stack으로 풀었다. 그전에, 뒤에서부터 배달 / 수거할 것이 없는 곳은 제거해 줬다. 0은 갈 필요 없으니... 그리고 수거할 곳, 배달할 곳 중 더 먼 곳을 answer에 넣어줬다. * 2를 한 이유는 왕복이니까.
box에 택배트럭에 담은 박스 개수를 넣어준 변수다. 이 값을 사용해서 현재 이 곳에 택배를 배달 혹은 수거할 수 있는지 확인해 준다. 이렇게 계속 진행하다 보면 d, p 모두 빈 배열이 되고 while 문이 종료된다.
import Foundation
//deliveries -> i+1번째 집에 배달할 택배 상자의 개수
//pickups -> i+1번째 집에서 수거할 택배상자의 개수
//가장 먼 거리를 먼저 끝내기 -> 최대한 한번에 끝내기
func solution(_ cap:Int, _ n:Int, _ deliveries:[Int], _ pickups:[Int]) -> Int64 {
var answer = 0
var d = deliveries
var p = pickups
while !d.isEmpty && d.last! == 0 { d.removeLast() } //배달없는 곳 삭제
while !p.isEmpty && p.last! == 0 { p.removeLast() } //수거없는 곳 삭제
while !d.isEmpty || !p.isEmpty { //둘 다 빌때까지
answer += max(d.count, p.count) * 2 //가장 먼 곳으로 이동
var box = cap
//배달
while !d.isEmpty && box >= 0 {
let now = d.removeLast()
if now <= box {
box -= now
}else {
d.append(now - box)
break
}
}
//수거
box = cap
while !p.isEmpty && box >= 0 {
let now = p.removeLast()
if now <= box {
box -= now
}else {
p.append(now - box)
break
}
}
}
return Int64(answer)
}
print(solution(4, 5, [1,0,3,1,2], [0,3,0,4,0]))
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Swift] 덧칠하기 (0) | 2023.03.26 |
---|---|
[프로그래머스/Swift] 이모티콘 할인 행사 (2023 Kakao Blind) (0) | 2023.03.24 |
[프로그래머스/Swift] 둘만의 암호 (0) | 2023.02.12 |
[프로그래머스/Swift] k진수에서 소수 개수 구하기 (0) | 2023.01.15 |
[프로그래머스/Swift] 점프와 순간 이동 (0) | 2023.01.15 |