[프로그래머스] 베스트 앨범 in Kotlin

ddanglehee·2022년 8월 4일
0

코딩테스트 준비

목록 보기
2/18
post-thumbnail

📜 문제

문제 링크

💡 나의 풀이

노래 수록 기준 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 를 구현할 때 장르 별 재생 수를 O(1)만에 구할 수 있도록 genresPlaysCountMap을 두었고,
남은 두 기준 2.장르 내에서 많이 재생된 노래를 먼저 수록합니다.3.장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.를 만족하려면 장르 별 노래 리스트가 있어야한다고 판단해서 genresMap을 두고 문제를 풀었다.

  1. 생성한 Map 채우기
  2. 속한 노래가 많이 재생된 장르 순으로 정렬하기
  3. 많이 재생된 노래 순으로 정렬하고, 재생횟수가 같은 노래 중에는 고유번호가 낮은 노래 순으로 정렬

⌨️ 코드

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 관련 메소드를 정리하는 시간을 가져야겠다!

profile
잊고싶지 않은 것들을 기록해요✏️

0개의 댓글