[백준] 프린터 큐 (1966)(kotlin)
문제 설명
입력 및 출력
» 입력
- 첫 줄에 테스트케이스의 수가 주어진다. 각 테스트케이스는 두 줄로 이루어져 있다. 테스트케이스의 첫 번째 줄에는 문서의 개수 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)
}
}