노래 수록 기준 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 를 구현할 때 장르 별 재생 수를 O(1)만에 구할 수 있도록 genresPlaysCountMap
을 두었고,
남은 두 기준 2.장르 내에서 많이 재생된 노래를 먼저 수록합니다.와 3.장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.를 만족하려면 장르 별 노래 리스트가 있어야한다고 판단해서 genresMap
을 두고 문제를 풀었다.
class BestAlbum {
fun solution(genres: Array<String>, plays: IntArray): IntArray {
var answer = arrayListOf<Int>()
val genresMap = mutableMapOf<String, ArrayList<Music>>() // key: 장르, value: 해당 장르 노래 리스트
val genresPlaysCountMap = mutableMapOf<String, Int>()
for (musicNumber in genres.indices) {
val genre = genres[musicNumber]
val playsCount = plays[musicNumber]
if (genre !in genresMap.keys) {
genresMap[genre] = arrayListOf(Music(musicNumber, playsCount))
genresPlaysCountMap[genre] = playsCount
} else {
genresMap[genre]!!.add(Music(musicNumber, playsCount))
genresPlaysCountMap[genre] = genresPlaysCountMap[genre]!! + playsCount
}
}
// 속한 노래가 많이 재생된 장르순으로 정렬
val genreList = genresPlaysCountMap.toList().sortedByDescending { it.second }.map { it.first }
genreList.forEach { genre ->
// 많이 재생된 노래 순으로 정렬하고, 재생횟수가 같은 노래 중에는 고유번호가 낮은 노래 순으로 정렬
val musicList = genresMap[genre]!!.sortedWith(compareByDescending<Music> { it.plays }.thenBy { it.num })
answer.add(musicList[0].num)
if (1 < musicList.size) answer.add(musicList[1].num)
}
return answer.toIntArray()
}
data class Music(val num: Int, val plays: Int)
}
문제에 주어진 조건대로 구현하면 돼서 level3까지의 난이도는 아닌 것 같다고 느꼈다!(아님 분류가 "해시"인 것을 명시해놔서 그런 걸 수도ㅎㅎ,,)
다만 아직 코틀린으로 코딩테스트를 푸는 게 익숙하지 않아서 구글링이 필요했고, 심지어 마지막에는 IDE를 켜서 문법을 확인하고나서 제출했다 ;(
오늘 알게된 Collections 관련 메소드를 정리하는 시간을 가져야겠다!