[백준] 후보 추천하기 (1713)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에는 사진틀의 개수 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()
}