문제 설명
문제 풀이
일단 이 문제의 핵심은 가장 거리가 먼 곳부터 처리를 해야한다는 것
거리를 최소화하려면 언젠간 멀리 있는 택배도 처리해야하기 때문에 첨부터 먼 곳부터 배달하면 된다.
먼 곳부터 처리한다 -> LIFO인 스택이 생각났다.
따라서 while문을 돌리며 popLast를 해주며 택배 수용범위인 cap까지 최대한 배달하고 수거한다.
코드
func solution(_ cap:Int, _ n:Int, _ deliveries:[Int], _ pickups:[Int]) -> Int64 {
var del = deliveries
var pick = pickups
var distance = 0
// 뒤에서 택배 개수가 0이면 다 제거
while !del.isEmpty {
let num = del.popLast()!
if num != 0 {
del.append(num)
break
}
}
while !pick.isEmpty {
let num = pick.popLast()!
if num != 0 {
pick.append(num)
break
}
}
while true {
// 남은 택배가 없으면 break
if del.isEmpty && pick.isEmpty {
break
}
// 가장 먼 곳에서 왕복 -> *2
distance += max(del.count, pick.count)*2
// 택배 배달
var count = cap
while !del.isEmpty {
let num = del.popLast()!
// 0이면 패스
if num == 0 {
continue
}
// cap을 넘어가면 break
else if count < num {
del.append(num-count)
break
}
else {
count -= num
}
}
// 택배 수거
count = 0
while !pick.isEmpty {
let num = pick.popLast()!
if num == 0 {
continue
}
// cap을 넘어가면 break
else if count+num > cap {
pick.append(num-(cap-count))
break
}
else {
count += num
}
}
}
return Int64(distance)
}
후기
풀이시간: 약 1시간 30분
1. while문이 빠져나오는 조건을 둘 다 비어있을때로 해야했는데 둘 중 하나만 비어도 빠져나오게 처리해서 틀렸다.
2. 테스트케이스 2번만 계속 틀렸는데.. 결국 질문하기에서 힌트를 봐서 처리했다.
-> 끝에 택배 개수가 0인 것들을 처리해주지 않아서 틀림
ex) [1,0] [1,0] 이 있으면 끝에 0은 볼 필요없는데 거리 2까지 감
푸는데 너무 오래 걸렸다..🥲
'알고리즘 문제 풀이' 카테고리의 다른 글
[프로그래머스 92335] k진수에서 소수 개수 구하기 swift (0) | 2023.10.30 |
---|---|
[프로그래머스 150370] 개인정보 수집 유효기간 swift (1) | 2023.10.28 |
[프로그래머스 150368] 이모티콘 할인행사 swift (1) | 2023.10.25 |
[프로그래머스 86971] 전력망을 둘로 나누기 swift (2) | 2023.10.13 |
[백준 1743] swift 음식물 피하기: DFS (0) | 2023.04.05 |