[Algorithm] 프로그래머스 : 프린터

1Consumption·2020년 3월 3일
1

Algorithm

목록 보기
5/8

프로그래머스 lv2 : 프린터

코드

import Foundation

func solution(_ priorities:[Int], _ location:Int) -> Int {
    let queue1 = Queue()
    let queue2 = Queue()
    
    var dequeuCount = 0
    
    var targetIndex = -1
    
    for priority in priorities.enumerated() {
        queue1.enqueue(element: (key: priority.offset, value: priority.element))
    }
    
    while targetIndex != location {
        let maximum = queue1.max()
        
        for _ in 0..<queue1.count() {
            let element = queue1.dequeue()
            
            if element.value == maximum {
                targetIndex = element.key
                while queue2.isEmpty() == false {
                    queue1.enqueue(element: queue2.dequeue())
                }
                break
            } else {
                queue2.enqueue(element: element)
            }
        }
        
        dequeuCount += 1
    }
    
    return dequeuCount
}

class Queue {
    var list = [(key: Int,value: Int)]()
    
    func dequeue() -> (key: Int,value: Int) {
        return list.removeFirst()
    }
    
    func enqueue(element: (key: Int,value: Int)) {
        list.append(element)
    }

    func isEmpty() -> Bool {
        return list.isEmpty
    }
    
    func count() -> Int {
        return list.count
    }
    
    func max() -> Int {
        return list.max{$0.value < $1.value}!.value
    }
}

풀이과정

프린트할 우선순위가 담겨있는 priorities: [Int]와 출력 시점을 알고자하는 대상의 인덱스가 담겨있는 location: Int 가 매개변수로 주어진다. 대기열 맨 앞에있는 요소가 대기열에 있는 다른 요소보다 우선순위가 낮다면, 해당 요소를 대기열 맨 뒤로 보낸다. 만약 현재 요소의 우선순위가 가장 높다면 프린터기가 프린트한다.

먼저 이를 위해 두개의 큐를 준비했다. 하나의 큐는 프린트할 리스트를 담은 큐(queue1)이고, 또 하나의 큐는 프린트할 리스트의 큐에서 우선순위가 밀린 리스트를 담는 큐(queue2)이다.
이 큐에 들어가는 리스트는 (key: Int, value:Int) 배열이다. key에는 해당 우선순위를 가진 작업의 인덱스가 들어가고, value에는 해당 작업의 우선순위가 들어가게 된다.

왜 (key: Int, value:Int) 배열을 사용하였는가?
우선순위가 같은 작업이 있을수도 있기 때문에 우선순위와 인덱스를 묶어서 특정 작업이 언제 실행되는지 알 수 있다.

  1. queue1에서 dequeue 한다.
  2. dequeue 된 값이 최고 우선순위가 아니라면 queue2에 enqueue 한다.
  3. 만약 dequeue된 값이 최고 우선순위라면 targetIndex에 해당 우선순위의 인덱스 값을 넣고, queue1에 queue2에 있는 값을 enqueue 한다.
  4. dequeuCount를 1증가시킨다(1장 프린트 되었다)
  5. targetIndex와 location이 같을 떄까지(내가 원하는 요소가 프린트가 되었다면) 해당 작업을 반복.
profile
개발자가되고싶어요

0개의 댓글