728x90
안녕하세요 코코종입니다.
이전에 파이썬으로 풀었던 문제인데 다시 풀어봤습니다. 파이썬 처럼 queue나 deque가 없는게 조큼 아쉽지만 악깡버 하겠습니다...
import Foundation
func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
// bridge_length -> 다리의 길이(동시에 올라갈수 있는 트럭수)
// weight -> 최대 무게
var answer = 0
var queue: [Int] = truck_weights
var bridge: [Int] = Array(repeating: 0, count: bridge_length)
var passed: [Int] = []
var sum = 0 // bridge의 합
while !(passed.count == truck_weights.count) { // passed에 모든 트럭이 올때까지
answer += 1
// bridge 먼저 이동
let f = bridge.first! // 가장 오래된 것
if f != 0 { // 비어있지 않으면
passed.append(f)
}
sum -= bridge.removeFirst()
let q: Int = queue.first ?? 0
if sum + q > weight { // 너무 무거워서 못들어감
bridge.append(0)
} else {
bridge.append(q)
sum += q
if q != 0 { queue.removeFirst() }
}
// print("queue", queue)
// print("bridge", bridge)
// print("passed", passed)
}
return answer
}
문제는 3개의 배열을 만들어 풀었습니다. 트럭의 대기열인 queue, 건너는 중인 다리 bridge, 다 건넌 passed.
처음에 1초가 지나면 bridge를 한칸씩 이동하고 맨 앞에(first)있는 요소를 제거하고 0이 아니라면 passed에 넣어줍니다. 그리고 queue의 first를 가져와서 nil 현재 다리가 버틸 수 있는지에 따라 bridge에 0 또는 q를 추가해줍니다. q를 추가해준다면 queue의 맨 앞에 것을 제거해주는것도 잊지 말아야 합니다. 참고로 저는 queue.first ?? 0 으로 nil에 대한 처리를 했습니다!
또한 처음에는 sum이라는 변수를 두지 않고 매번 reduce를 통해 bridge의 합을 계산하는 바람에 일부 시간초과가 났습니다! 다들 참고하셔요!
728x90
'알고리즘' 카테고리의 다른 글
[Swift 알고리즘] 프로그래머스 - 기능개발 (0) | 2023.05.07 |
---|---|
[Swift 알고리즘] 프로그래머스 - 의상 (0) | 2023.05.05 |
[Swift 알고리즘] 프로그래머스 - 예상 대진표 (0) | 2023.05.04 |
[Swift 알고리즘] 프로그래머스 - 영어 끝말잇기 (0) | 2023.05.04 |
[Swift 알고리즘] 프로그래머스 - 배달 (0) | 2023.05.02 |