240112 TIL #293 CT_프린터큐 with Kotlin

김춘복·2024년 1월 12일
0

TIL : Today I Learned

목록 보기
293/494

Today I Learned

안드로이드 공부를 쭉 하면서 코테도 매일 꾸준히 풀고있다. 평소처럼 자바로 문제를 풀다가, 기왕 안드로이드와 코틀린을 공부하는데 코틀린으로도 문제를 풀어보고 싶어서 코틀린으로 가벼운 문제들도 하나씩 풀어보고 있다. 생각보다 손에 익지는 않아서 오늘처럼 가끔씩 코틀린으로 코테를 풀면서 사용한 생소한 함수들과 팁들을 정리해두려 한다.


프린터큐

https://www.acmicpc.net/problem/1966


문제

프린터를 다음과 같은 규칙으로 운영하려고 한다.
1. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다.
2.나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다.

첫 줄에 테스트케이스의 수, 각 테스트케이스는 첫줄에 문서의 개수 N(1 ≤ N ≤ 100)와 타겟 문서가 현재 Queue에서 몇 번째에 놓여 있는지를 나타내는 정수 M(0 ≤ M < N), 두번째 줄에 N개 문서의 중요도가 차례대로 주어진다.(중요도는 1~9, 중복가능)


풀이과정

  1. 순서와 중요도를 프로퍼티로 가지는 Print 데이터 클래스를 만들고 이를 MutableList로 다룬다.

  2. 테스트케이스 수에 맞게 repeat 한다.

  3. 리스트의 맨 앞에서 Print하나를 꺼내서 뒤의 중요도와 비교후 하나라도 큰게 있으면 리스트의 맨 뒤에 다시 삽입한다.

  4. 현재 Print가 가장 중요도가 크면 idx를 하나 늘리고 현재 프린트가 타겟인지 보고 맞으면 break 시킨다.


함수 정리

  • main() = with(System.in.bufferedReader())
    자바로 문제를 풀 때처럼, 속도상의 문제로 Scanner 클래스을 이용하는 대신 bufferedReader 를 사용하면 더 좋다.
    main()에서 바로 with 문으로 bufferedReader의 함수들을 객체 생성 없이 가능하다.

  • repeat()
    이 함수는 반복 횟수를 인자로 받아 지정된 횟수만큼 블록을 반복한다.
    반복문을 간단히 쓸 수 있다.

  • val (N, M) = readln().split(" ").map { it.toInt() }
    변수를 동시에 할당할 수 있다.
    map을 써서 바로 int로 바꿔줬다.

  • val list = importance.mapIndexed { index, value -> Print(index, value) }.toMutableList()
    배열의 index와 value를 이용해 바로 Print객체의 MutableList를 구현했다.

  • if (list.any { it.priority > current.priority })
    any는 컬렉션의 모든 원소가 어떤 조건을 만족하는지 판단하는 연산을 할 수 있다.


Kotlin 코드

data class Print(val num: Int, val priority: Int)

fun main() = with(System.`in`.bufferedReader()){
    val nOfTestCase = readln().toInt()

    repeat(nOfTestCase) {
        val (N, M) = readln().split(" ").map { it.toInt() }
        val importance = readln().split(" ").map { it.toInt() }

        val list = importance.mapIndexed { index, value -> Print(index, value) }.toMutableList()

        var idx = 0

        while (true) {
            val current = list.removeAt(0)
            if (list.any { it.priority > current.priority }) {
                list.add(current)
            } else {
                idx++
                if (current.num == M) break
            }
        }
        println(idx)
    }
}
profile
꾸준히 성장하기 위해 매일 log를 남깁니다!

0개의 댓글