본문 바로가기
Algorithm/문제풀이_프로그래머스

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

by Joahnee 2022. 4. 12.

요구능력

 

문제풀이

큐를 따로 구현해줘야하니 이글을 먼저 읽고오시는걸 추천드립니다.

 

트럭이 정해진 순서대로 다리를 건넌다고한다.

다리를 건너는 트럭의 경우에는 뒤에서 들어와서 앞으로 나가니까 큐를 생각하게된다.

예제 1번으로 설명을하면

다리를 건너는 트럭의 큐(contiQueue)는 처음에 다리의 길이가 2이기 때문에 아래와 같이 생성된다.

0초

[0, 0]

 

1초

[0, 7]

 

2초

[7, 0]

 

3초

[0, 4]

 

4초
[4, 5]

 

5초

[5, 0]

 

6초

[0, 6]

 

여기까지돌고 마지막에 들어온 6은 맨 마지막에 따로 다리의 길이만큼 더해줘서 마지막 트럭이 다리를 건너는 시간을 처리해줬다.

 

후기

쉬운문제이지만, Swift의 경우에는 큐를 따로 구현해줘야 최적화되기 때문에 난이도가 있는편이다.

 

코드

struct Queue<T>{
    var enqueue: [T]
    var dequeue: [T] = []
    mutating func push(_ x: T){
        enqueue.append(x)
    }
    mutating func pop() -> T?{
        if dequeue.isEmpty{
            dequeue = enqueue.reversed()
            enqueue.removeAll()
        }
        return dequeue.popLast()
    }
    
}
func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
    //지나는중인트럭
    var contiQueue = Queue(enqueue: Array(repeating: 0, count: bridge_length))
    var second = 0
    var sum = 0
    var idx = 0
    while idx < truck_weights.count{
        //한번돌때마다 초더해주고
        second += 1
        if let popped = contiQueue.pop(){
            sum -= popped
        }
        if sum + truck_weights[idx] <= weight {
            let pop = truck_weights[idx]
            idx += 1
            sum += pop
            contiQueue.push(pop)
            
        }else{
            contiQueue.push(0)
        }
        
    }
    //마지막 트럭이 다리를 건너는시간
    second += bridge_length
    return second
}

댓글