[Algorithm] 프로그래머스 : 다리를 지나는 트럭

1Consumption·2020년 3월 6일
1

Algorithm

목록 보기
6/8

프로그래머스 lv2 : 다리를 지나는 트럭

코드

import Foundation

func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
    let truckInBridge = Queue()
    let truckPassedBridge = Queue()
    var currentTruckIndex = 0
    var time = 1
    
    while truckPassedBridge.count() != truck_weights.count {
        if truck_weights.count > currentTruckIndex {
            if truckInBridge.total() + truck_weights[currentTruckIndex] <= weight {
                truckInBridge.enqueue(element: (wegiht: truck_weights[currentTruckIndex], time: bridge_length))
                currentTruckIndex += 1
            }
        }
        
        truckInBridge.decreaseTime()
        
        let dequeueElement = truckInBridge.dequeue()
        
        if dequeueElement.time == 0 {
            truckPassedBridge.enqueue(element: dequeueElement)
        } else {
            truckInBridge.enqueueFirst(element: dequeueElement)
        }
        
        
        time += 1
    }
    return time
}

class Queue {
    var list = [(wegiht: Int, time: Int)]()
    
    func dequeue() -> (wegiht: Int, time: Int) {
        return list.removeFirst()
    }
    
    func enqueue(element: (wegiht: Int, time: Int)) {
        list.append(element)
    }
    
    func enqueueFirst(element: (wegiht: Int, time: Int)) {
        list = [element] + list
    }
    
    func isEmpty() -> Bool {
        return list.isEmpty
    }
    
    func count() -> Int {
        return list.count
    }
    
    func total() -> Int {
        return list.reduce(0){
            $0 + $1.wegiht
        }
    }
    
    func decreaseTime() {
        for idx in 0..<list.count {
            list[idx].time -= 1
        }
    }
}

풀이과정

총 3개의 파라미터가 주어지는데, 다리의 길이 bridge_length:Int, 다리가 견딜 수 있는 하중 weight:Int, 트럭의 배열 truck_weights:[Int] 이다. 또한 트럭은 1초에 1만큼 움직인다.

두개의 큐를 선언해 줬다. 현재 다리에 있는 트럭을 담고 있는 truckInBridge, 그리고 다리를 건넌 트럭을 담고 있는 truckPassedBridge가 있다. 이 두 큐에 들어가는 element는 트럭의 무게와, 남은 시간이 들어가게 된다. 즉 초기에 큐의 엘리먼트로 들어가게 된다면 (트럭의 무게, 터널의 길이) 이 형식이 들어간다.
현재 트럭의 인덱스를 담고 있는 currentTruckIndex도 선언해 줬다.

로직은 다음과 같다.
1. currentTruckIndex가 트럭의 수를 넘었는지 검사하고, 넘지 않았다면 truckInBridge 큐에 현재 트럭을 넣어준다. 그리고 currentTruckIndex를 1만큼 증가한다.
2. truckInBridge내의 time 프로퍼티를 1만큼 감소한다.
3. truckInBridge를 dequeue한 엘리먼트의 time 프로퍼티가 0 이라면(터널을 다 건넜다면) truckPassedBridge 큐에 넣어준다. 만약 그렇지 않다면, 다시 truckInBridge 큐에 dequeue했던 엘레먼트를 대기열 맨 앞에 넣어준다.
4. time을 1만큼 증가한다.
5. truckPassedBridge큐의 엘리먼트의 수가 총 트럭의 수와 같아질 때까지 해당 작업을 반복한다.

아쉬운 점

꼭 Queue를 클래스로 선언해야 했을까? swif에서 지원하는 배열 메소드를 활용해 충분히 그 기능을 수행할 수 있지 않았을까?
다음부터 스택, 큐 관련된 문제를 풀 때는 한번 Queue클래스를 정의하지 않고 배열만을 이용해서 해봐야겠다.

profile
개발자가되고싶어요

1개의 댓글

comment-user-thumbnail
2020년 3월 7일

👍

답글 달기