본문 바로가기

코딩테스트

[프로그래머스] 프린터

난이도 : Lv 2

분류 : 스택 / 큐

 

문제

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드

 

import Foundation

func solution(_ priorities:[Int], _ location:Int) -> Int {
  var priority = priorities
  var pos = location
  var answer = 0
  
  while true {
        if priority.first! == priority.max() {
        // 대기열 중 첫번째가 대기열 중 가장 우선순위가 높을 때
        
            priority.removeFirst()
            // 대기열에서 지운다.
            
            answer += 1
            // 하나를 처리했으니 출력 순서에 1을 더한다.
            
            if pos == 0 { break } else { pos -= 1 }
            // 내가 요청한 문서의 위치가 0 이라면 반복문을 종료하고, 그렇지 않다면 위치를 1 앞당긴다.
            
        } else {
        // 대기열 중 첫번째가 대기열 중 가장 우선순위가 높지 않을 때
        
            let temp = priority.removeFirst()
            // 뒤로 보내기 위해 따로 보관한 후 대기열에서 지운다.
            
            priority.append(temp)
            // 대기열의 가장 뒤에 추가한다.

            if pos == 0 { pos = priority.count - 1 } else { pos -= 1 }
            // 내가 요청한 문서의 위치가 0 이라면 대기열의 가장 끝 위치로 옮기고, 그렇지 않다면 1 앞당긴다.
        }
    }
  return answer
}

 

풀이

1. 대기열 중 우선순위가 높은 요청이 먼저 처리되려면 우선순위가 가장 높은 요청이 나올 때 까지 그렇지 않은 것들을 뒤로 보낸다.

2. 처리 가능한 요청이 있으면 출력 순서에 1을 더한다.

3. 계속 반복하면서 내가 요청한 문서가 우선순위가 가장 높을 때, 반복문을 빠져나오면서 출력 순서를 return 한다.

 

P.S

처음 풀었을 때, 지금 다시 볼 때 한 번에 이해가 가지 않았다.

스택/ 큐 보다는 덱에 가까운 문제가 아닌가 싶다.

좀 더 다양한 사고를 하도록 노력해야겠다.