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

Updated:

문제 설명

29

나의 풀이

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을 트래킹하기 위해서 로직을 따로 작성한 부분이 다른 것 같다.

참고

Programmers

Leave a comment