문제 링크
문제 해설
맵과 정렬을 이용하여 풀 수 있는 문제다. 풀이 과정은 다음과 같다.
- 맵에는 Key로 학생의 이름을, Value로 학생들의 인기도를 저장한다.
- 학생 이름과 인기도를 필드로 갖는 Student 클래스에 Comparable 인터페이스를 구현하여 인기도는 내림차순, 인기도가 같으면 이름 기준 오름차순으로 정렬할 수 있게 한다.
- 인기도 저장이 끝난 이후에는 각 학생 이름과 인기도로 Student 객체를 생성하여 별도의 리스트나 배열에 저장한다.(필자는 우선순위 큐를 사용했다.)
- 정렬된 순서대로 학생들의 이름과 인기도를 출력한다.
Code
import java.util.PriorityQueue
import java.util.StringTokenizer
fun main() = with(System.`in`.bufferedReader()) {
val bw = System.out.bufferedWriter()
val n = readLine().toInt()
val students = HashMap<String, Int>()
val pq = PriorityQueue<Student>()
StringTokenizer(readLine()).apply {
repeat(n) { students[nextToken()] = 0 }
}
repeat(n) {
StringTokenizer(readLine()).apply {
while (hasMoreTokens()) {
nextToken().also { students[it] = students[it]?.plus(1) ?: 1 }
}
}
}
for (k in students.keys) {
pq.add(Student(k, students[k] ?: 0))
}
while (pq.isNotEmpty()) {
pq.poll().also { bw.write("${it.name} ${it.popularity}\n") }
}
bw.close()
}
class Student(val name: String, var popularity: Int) : Comparable<Student> {
override fun compareTo(other: Student) =
if (this.popularity == other.popularity) this.name.compareTo(other.name)
else other.popularity - this.popularity
}
'Algorithm > BOJ' 카테고리의 다른 글
[Kotlin] 백준 1490 : 자리수로 나누기 (0) | 2022.12.29 |
---|---|
[Kotlin] 백준 17390 : 이건 꼭 풀어야 해! (0) | 2022.12.28 |
[Kotlin] 백준 1092 : 배 (0) | 2022.12.24 |
[Kotlin] 백준 1456 : 거의 소수 (1) | 2022.12.23 |
[Kotlin] 백준 25192 : 인사성 밝은 곰곰이 (0) | 2022.12.21 |
댓글