[백준] 후보 추천하기 (1713)(kotlin)

문제 설명

백준 1713번 문제 링크

입력 및 출력

» 입력

첫째 줄에는 사진틀의 개수 N이 주어진다. (1 ≤ N ≤ 20) 둘째 줄에는 전체 학생의 총 추천 횟수가 주어지고, 셋째 줄에는 추천받은 학생을 나타내는 번호가 빈 칸을 사이에 두고 추천받은 순서대로 주어진다. 총 추천 횟수는 1,000번 이하이며 학생을 나타내는 번호는 1부터 100까지의 자연수이다.

» 출력

사진틀에 사진이 게재된 최종 후보의 학생 번호를 증가하는 순서대로 출력한다.

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

입력 출력
3
9
2 1 4 3 5 6 2 7 2
2 6 7
3
14
2 1 4 3 5 6 2 7 2 100 100 54 54 50
50 54 100
3
10
3 4 3 3 1 2 4 1 5 7
3 5 7
2
11
1 2 2 2 3 3 1 1 1 3 3
1 3

문제 풀이1

import java.util.LinkedList

data class Student(val id: Int, var reco: Int, var order: Int) : Comparable<Student> {
    override fun compareTo(other: Student): Int {
        return if (this.reco != other.reco) {
            other.reco - this.reco
        } else {
            this.order - other.order
        }
    }

    override fun toString(): String {
        return this.id.toString()
    }
}

class StudentBuffer(val maxSize: Int) {
    private val q = LinkedList<Student>()
    private var capacity = 0

    fun add(st: Student) {
        val query = q.find { it.id == st.id }

        if (capacity < maxSize) {
            if (query != null) {
                query.reco += 1
            } else {
                capacity += 1
                q.add(st)
            }
        } else {
            if (query != null) {
                query.reco += 1
            } else {
                q.poll()
                q.add(st)
            }
        }

        sorted()
    }

    fun printAll() = println(q.toMutableList().sortedBy { it.id }.joinToString(" "))

    private fun sorted() {
        q.sortWith { o1, o2 ->
            if (o1.reco == o2.reco) {
                o1.order - o2.order
            } else {
                o1.reco - o2.reco
            }
        }
    }
}

fun main() = with(System.`in`.bufferedReader()) {
    val N = readLine().toInt()
    val reco = readLine().toInt()
    val students = readLine().split(" ").map { it.toInt() }
    val sb = StudentBuffer(N)

    students.forEachIndexed { index, i ->
        sb.add(Student(i, 1, index))
    }

    sb.printAll()
}