본문 바로가기
알고리즘

[Swift 알고리즘] 프로그래머스 - 다리를 지나는 트럭

by 코코종 2023. 5. 6.
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