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) 배열을 사용하였는가?
우선순위가 같은 작업이 있을수도 있기 때문에 우선순위와 인덱스를 묶어서 특정 작업이 언제 실행되는지 알 수 있다.