[Kotlin/프로그래머스] 코딩테스트 연습 > 스택/큐 > 프린터

👀 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42587?language=kotlin

👊 도전

1. 설계

  1. 문제 조건에 맞게 진행

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.*

class Solution {
    fun solution(priorities: IntArray, location: Int): Int {
        /*
        큐에다가 Pair<index, prior> 형태로 넣고
        poll한거의 location이 맞으면 cnt 리턴
        max면 pop 하고 cnt ++ 아니면 다시 push (cnt 초기화는 1)
        max 체크는 descPriorities 리스트.desc로 sort 얘를 가리키는 인덱스도 필요
        */
        var answer = 1
        val queue: Queue<Pair<Int, Int>> = LinkedList()
        val descList = priorities.sortedDescending()
        var descIndex = 0
        priorities.forEachIndexed { index, priority ->
            queue.offer(priority to index)
        }
        while (queue.isNotEmpty()) {
            val item = queue.poll()
            if (item.second == location && item.first == descList[descIndex]) {
                return answer
            }
            if (item.first == descList[descIndex]) {
                answer ++
                descIndex ++
            } else {
                queue.offer(item)
            }
        }
        return answer
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. Queue를 이용해 대기 목록을 관리
    • 맨 앞의 값이 max면 뽑을 수 있고, 아니라면 맨 뒤에 삽입해야하므로 큐가 적절하다.
    • 중요도와 인덱스를 함께 가져야 하므로 Pair 형으로 저장한다.
  2. 중요도 체크는 priorities를 내림차순 정렬한 리스트로 확인
    • priorities를 내림차순으로 정렬한다(descList)
    • 인쇄되지 않은(큐에서 뽑히지 않은) 것 들 중 max를 나타내는 인덱스 descIndex를 둔다.
  3. poll해서 체크
    • 큐에서 poll 한 값이 조건에 맞는지 체크한다.
    • 내가 알고 싶은 location이고 현재 max라면 해당 값을 리턴한다.
    • 아니라면, 현재 큐에 있는 값 들 중 max인지 확인해서 맞다면 pop 및 cnt ++ (cnt는 뽑힌 개수를 나타낸다).
    • max가 아니라면 맨 뒤에 삽입한다.

👏 해결 완료!