본문 바로가기
코딩테스트 준비(kotlin)/자료구조

[kotlin, 프로그래머스] 베스트앨범

by 1chanhue1 2024. 7. 31.

//프로그래머스 - 베스트앨범
fun solution(genres: Array<String>, plays: IntArray): IntArray {
    // 장르별 총 재생 횟수
    val genrePlayCount = mutableMapOf<String, Int>()

    // 장르별 노래 목록
    val genreMusics = mutableMapOf<String, MutableList<Pair<Int, Int>>>()

    for (i in genres.indices) {
        val genre = genres[i]
        val play = plays[i]

        // 장르별 총 재생 횟수 갱신 - 장르를 키 값으로 해서 재생횟수 갱신
        genrePlayCount[genre] = genrePlayCount.getOrDefault(genre, 0) + play

        // 장르별 노래 목록 갱신
        if (genre !in genreMusics) { // 없을 경우 생성
            genreMusics[genre] = mutableListOf()
        }
        genreMusics[genre]!!.add(Pair(i, play))
    }

    // 장르를 총 재생 횟수 기준으로 내림차순 정렬
    val sortedGenres = genrePlayCount.toList().sortedByDescending { it.second }.map { it.first }

    val result = mutableListOf<Int>()

    for (genre in sortedGenres) {
        // 각 장르 내에서 노래를 재생 횟수와 고유 번호를 기준으로 정렬
        val musics = genreMusics[genre]!!.sortedWith(compareByDescending<Pair<Int, Int>> { it.second }.thenBy { it.first })

        // 최대 두 개의 노래를 결과에 추가
        for (i in 0 until minOf(2, musics.size)) {
            result.add(musics[i].first)
        }
    }

    return result.toIntArray()
}











// 테스트 코드
fun main() {
    val genres = arrayOf("classic", "pop", "classic", "classic", "pop")
    val plays = intArrayOf(500, 600, 150, 800, 2500)
    val result = solution(genres, plays)
    println(result.joinToString(", "))  // [4, 1, 3, 0]
}