알고리즘/프로그래머스

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

녕이 2023. 3. 25. 15:21
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/150369

 

프로그래머스

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

programmers.co.kr

 

이 문제는 가장 먼 거리를 먼저 끝내면 된다! 가장 먼 거리는 한 번만 가도록 한다. (최소 거리를 위해)

일단 이 문제는 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