[Algorithm] 프로그래머스 프린터
Updated:
문제 설명
나의 풀이
import Foundation
func solution(_ priorities:[Int], _ location:Int) -> Int {
var waitingQueue: [Printable] = []
var maxPriority = 0
for (index, priority) in priorities.enumerated() {
waitingQueue.append(Printable(index: index, priority: priority))
maxPriority = max(priority, maxPriority)
}
var printCount = 0
while !waitingQueue.isEmpty {
let printable = waitingQueue.removeFirst()
if printable.priority >= maxPriority {
printCount += 1
if printable.index == location {
return printCount
}
if let priority = waitingQueue.sorted(by: { $0.priority > $1.priority }).first?.priority {
maxPriority = priority
}
}
else {
waitingQueue.append(printable)
}
}
return printCount
}
struct Printable {
let index: Int
let priority: Int
}
location을 기억해야해서 Printable
이라는 구조체 타입을 생성하고 [Printable]
을 스택처럼 활용하여 가장 큰 priority와 비교하여 작으면 뒤로가고, 같거나 크면 출력하는 형태로 구현하였다.
괜찮은 남의 풀이
import Foundation
func solution(_ priorities:[Int], _ location:Int) -> Int {
var cPriorities = priorities
var targetIndex = location
while cPriorities.count > 0 {
if cPriorities.contains(where: { $0 > cPriorities[0] }) {
let first = cPriorities.removeFirst()
cPriorities.append(first)
targetIndex = targetIndex - 1 < 0 ? cPriorities.count - 1 : targetIndex - 1
} else {
if(targetIndex == 0) {
return priorities.count - cPriorities.count + 1
}
cPriorities.removeFirst()
targetIndex = targetIndex - 1
}
}
return 0
}
비슷한 로직이지만, location을 트래킹하기 위해서 로직을 따로 작성한 부분이 다른 것 같다.
Leave a comment