본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 1966 : 프린터 큐

by 개발하는 곰돌이 2022. 11. 30.

문제 링크

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net



문제 해설

큐(Queue)를 이용하면 쉽게 풀 수 있다. 우선 문서가 인쇄 대기열에 등록된 순서와 중요도를 묶은 배열을 모두 큐에 삽입한다. 그 후 M번째 문서가 인쇄될 때까지 아래 과정을 반복해서 수행한다.(코드의 14~25번째 줄)

  1. 현재 인쇄 대기열의 0번째 문서의 중요도가 가장 높은지 확인한다.
  2. 가장 높을 경우 해당 문서를 인쇄하고 원래 순서가 M이면 반복문을 종료한다.
  3. 가장 높은 경우가 아니면 해당 문서를 빼서 다시 큐의 맨 뒤에 삽입한다.

이 과정을 반복해서 수행하다가 반복문이 종료되었을 때의 총 인쇄 횟수가 답이 된다.


Code

import java.util.LinkedList
import java.util.Queue
import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    val bw = System.out.bufferedWriter()
    repeat(readLine().toInt()) {
        val queue: Queue<IntArray> = LinkedList()
        val (n, m) = readLine().split(' ').map { it.toInt() }
        val st = StringTokenizer(readLine())
        repeat(n) {
            queue.add(intArrayOf(it, st.nextToken().toInt()))
        }
        var print = 0	// 인쇄를 한 횟수
        while (true) {
            // 큐에서 첫문서의 중요도가 큐에 있는 문서들의 최대 중요도와 동일하면 인쇄
            if (queue.peek()[1] == queue.maxOf { it[1] }) {
                print++
                if (queue.poll()[0] == m) break	// m번째 문서를 인쇄하면 반복 종료
            } else {
                queue.add(queue.poll())
            }
        }
        bw.write("$print\n")
    }
    bw.close()
}

댓글