[プログラマーレベル3]ベストアルバム



に質問


ストリーミングサイトでは、最も多く再生された曲を2曲集め、ベストアルバムを発売します.曲は唯一の番号で区切られており、収録曲の基準は以下の通りである.
まずは
  • でたくさんの曲が流れたタイプを収録
  • まずは
  • タイプで放送された曲を収録
  • タイプで同じ再生回数の曲のうち、まず唯一番号の低い曲を収録する.
  • 曲タイプを表す文字列配列タイプと、曲の再生回数を表す整数配列シナリオを指定する場合は、solution関数を完了し、最適なアルバムを入れる曲の一意の番号を順番に返します.

    せいげんじょうけん

  • タイプ[i]は、固有番号iの楽曲タイプである.
  • play[i]は、唯一i番の曲が再生された回数である.
  • ジャンルはシナリオと同じ長さで、1以上10000以下である.
  • タイプは100個未満です.
  • タイプの1曲なら1曲のみ.
  • すべてのタイプの再生回数が異なります.
  • 💡 に答える

    class Solution {
        fun solution(genres: Array<String>, plays: IntArray): IntArray {
            var answer = intArrayOf()
            val genres = genres.mapIndexed { index, genre -> Pair(genre, index) }
            val genresMap = genres.groupBy( {it.first}, {it.second} )
            var genresMapWithPlays = genresMap.mapValues { it.value.map { Pair(it, plays.get(it))} }.mapValues { it.value.sortedByDescending { it. second } }
            val playsByGenre = genresMap.mapValues{ it.value.fold(0) { acc, num -> acc + plays.get(num) } }.toList().sortedByDescending { it.second }.toMap()
                    
            playsByGenre.forEach { genre, totalPlay ->
                val songList = genresMapWithPlays.get(genre)
                
                if(songList!!.size == 1)
                    answer += (songList[0].first)
                else {
                    answer += (songList[0].first)
                    answer += (songList[1].first)
                }
            }
            
            return answer
        }
    }