[백준] 프린터 큐 (1966)(kotlin)

문제 설명

백준 1966번 문제 링크

입력 및 출력

» 입력

  • 첫 줄에 테스트케이스의 수가 주어진다. 각 테스트케이스는 두 줄로 이루어져 있다. 테스트케이스의 첫 번째 줄에는 문서의 개수 N(1 ≤ N ≤ 100)과, 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue에서 몇 번째에 놓여 있는지를 나타내는 정수 M(0 ≤ M < N)이 주어진다. 이때 맨 왼쪽은 0번째라고 하자. 두 번째 줄에는 N개 문서의 중요도가 차례대로 주어진다. 중요도는 1 이상 9 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.

» 출력

각 테스트 케이스에 대해 문서가 몇 번째로 인쇄되는지 출력한다.

예제 입출력(테스트케이스)

입력 출력
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
1
2
5

문제 풀이1

import java.util.LinkedList

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    repeat(readLine().toInt()) {
        val (n, t) = readLine().split(" ").map { it.toInt() }
        val ll = LinkedList<Pair<Int, Int>>()
        val priority = readLine().split(" ").map { it.toInt() }.toMutableList()
        var res = 0
        var check = false

        priority.forEachIndexed { index, s ->
                ll.add(Pair(index, s))
        }

        val set = priority.toSortedSet()

        while (!check) {
            val max = set.last()
            var maxCount = ll.count { it.second == max }

            while (maxCount > 0) {
                val q = ll.poll()

                if (max != q.second) {
                    ll.add(q)
                } else {
                    if (t == q.first) {
                        res++
                        check = true
                        break
                    }

                    res++
                    maxCount--
                }

            }

            if (!check) set.remove(max)
            else break
        }

        println(res)
    }
}

문제 풀이2

import java.util.LinkedList
import java.util.PriorityQueue
import java.util.Collections

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    repeat(readLine().toInt()) {
        val (_, target) = readLine().split(" ").map { it.toInt() }
        val ll = LinkedList<Pair<Int, Int>>()
        val pq = PriorityQueue<Int>(Collections.reverseOrder())

        var res = 0

        readLine()
            .split(" ")
            .forEachIndexed { index, s ->
                val priority = s.toInt()
                ll.add(Pair(index, priority))
                pq.add(priority)
            }

        while (ll.isNotEmpty()) {
            val current = ll.poll()

            if (current.second == pq.peek()) {
                res++
                pq.poll()
                if (current.first == target) break
            } else ll.add(current)
        }

        println(res)
    }
}