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

[Kotlin] 백준 25325 : 학생 인기도 측정

by 개발하는 곰돌이 2022. 12. 25.

문제 링크

 

25325번: 학생 인기도 측정

학생 이름이 공백으로 구분된 문자열 A가 주어진다. 문자열 A에는 중복된 학생 이름이 존재하지 않는다. 학생 이름은 알파벳 소문자로 이루어져 있다. 각 학생이 좋아하는 학생의 학생 이름 목록

www.acmicpc.net


 


문제 해설

맵과 정렬을 이용하여 풀 수 있는 문제다. 풀이 과정은 다음과 같다.

  1. 맵에는 Key로 학생의 이름을, Value로 학생들의 인기도를 저장한다.
  2. 학생 이름과 인기도를 필드로 갖는 Student 클래스에 Comparable 인터페이스를 구현하여 인기도는 내림차순, 인기도가 같으면 이름 기준 오름차순으로 정렬할 수 있게 한다.
  3. 인기도 저장이 끝난 이후에는 각 학생 이름과 인기도로 Student 객체를 생성하여 별도의 리스트나 배열에 저장한다.(필자는 우선순위 큐를 사용했다.)
  4. 정렬된 순서대로 학생들의 이름과 인기도를 출력한다.

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
}

댓글