본문 바로가기

개발/알고리즘

[프로그래머스] 스택/큐 - 프린터

반응형
 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

입력 

인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면
J를 대기목록의 가장 마지막에 넣습니다. 그렇지 않으면 J를 인쇄합니다.

출력

인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요

풀이

중요도와 문서를 함께 구분하기 위해 튜플을 사용해서 풀었다
이 문제의 함정은 for문을 사용해서 풀시, index값에 주의해야하는 점이다
큐의 방식으로 작동하며 문서 순서가 바뀌면 처음부터 다시 배열을 확인하는 작업을 거친다

+
더 좋은 방법은 큐를 정렬하며 동시에 location 위치의 값을 찾는 것이다
배열의 첫번째는 중요도가 가장 높은 문서를 배치하고
location의 위치가 0 일 경우 전체 문서 개수 - 정렬된 문서 개수 + 1 을 출력한다
location의 위치가 0이 아닐 경우 첫번째 문서를 제거하며 location 값을 하나 낮춘다

Swift 전체 코드

var list : [(Int, Int)] = []
var i = 1
var count = 0

for i in 0..<priorities.count {
    list.append((i, priorities[i]))
}

while count != list.count - 1 {
    if list[count].1 < list[i].1 {
        let temp = list.remove(at: count)
        list.append(temp)
        i = count
        count = 0
        continue
    }
    if i == list.count - 1 {
        count += 1
        i = count
    }
    i += 1
}

return list.firstIndex(where: { $0.0 == location})! + 1

 

+ 개선된 코드

var priority = priorities
var position = location

while priority.count > 0 {
    if priority.contains(where: { $0 > priority[0] }) {
        let first = priority.removeFirst()
        priority.append(first)
        position = position - 1 < 0 ? priority.count - 1 : position - 1
    } else {
        if position == 0 {
            return priorities.count - priority.count + 1
        }
        priority.removeFirst()
        position -= 1
    }
}

return 0
반응형