최근 프로그래머스에 있는 베스트 앨범 문제를 풀어보았는 데
다른 사람의 코드를 보고 아주 놀라서 정리해 보았다.
아래의 코드로 결과가 나오는데 딱 보기에는 이해가 되지 않아서
한줄씩 출력해본 결과를 정리했다.
genres.indices.groupBy { genres[it] }
.toList()
.sortedByDescending { it.second.sumBy { plays[it] } }
.map { it.second.sortedByDescending { plays[it] }.take(2) }
.flatten()
.toIntArray()
genres.indices
>>> indices: 0..4
indices
함수는 Array
의 유효한 인덱스를 IntRange
로 반환한다.
genres.indices.groupBy { genres[it] }
>>> groupBy: {classic=[0, 2, 3], pop=[1, 4]}
인덱스를 이용해 genres
의 값을 key 로 Map
을 생성한다.
genres.indices.groupBy { genres[it] }
.toList()
>>> toList: [(classic, [0, 2, 3]), (pop, [1, 4])]
toList
로 Map
을 List<Pair>
로 변환한다.
genres.indices.groupBy { genres[it] }
.toList()
.sortedByDescending { it.second.sumBy { plays[it] } }
>>> sortedByDescending: [(pop, [1, 4]), (classic, [0, 2, 3])]
sortedByDescending
함수로 내림차순 정렬을 하는데 Pair
의 두번째 값, 인덱스의 리스트를 이용하여 plays
의 합을 기준으로 정렬한다.
genres.indices.groupBy { genres[it] }
.toList()
.sortedByDescending { it.second.sumBy { plays[it] } }
.map { it.second.sortedByDescending { plays[it] } }
>>> map: [[4, 1], [3, 0, 2]]
정렬한 값을 map
을 이용하여 리스트로 반환하는데 Pair
의 두번째 값인 인덱스 리스트를 돌면서 해당 plays
가 높은 값부터 내림차순 정렬한 리스트를 반환한다.
genres.indices.groupBy { genres[it] }
.toList()
.sortedByDescending { it.second.sumBy { plays[it] } }
.map { it.second.sortedByDescending { plays[it] }.take(2) }
>>> take: [[4, 1], [3, 0]]
반환된 리스트를take
함수를 이용해 2개의 요소만 가지게 한다.
genres.indices.groupBy { genres[it] }
.toList()
.sortedByDescending { it.second.sumBy { plays[it] } }
.map { it.second.sortedByDescending { plays[it] }.take(2) }
.flatten()
>>> flatten: [4, 1, 3, 0]
리스트 안에 리스트가 있는 상태인데 flatten
함수를 이용하여 하나의 리스트로 변환한다.
genres.indices.groupBy { genres[it] }
.toList()
.sortedByDescending { it.second.sumBy { plays[it] } }
.map { it.second.sortedByDescending { plays[it] }.take(2) }
.flatten()
.toIntArray()
>>> toIntArray: [I@548c4f57
최종적으로 리스트를 IntArray
로 변환하게 되면 원하는 값이 나오게 된다.
문제는 프로그래머스 사이트에 있으며
20/07/13 현재 Yoonsung Nam , nhj-_- , 윤수현
이렇게 3분이 해당 코드를 작성하셨다
나의 풀이
class Solution{ fun solution(genres: Array<String>, plays: IntArray): IntArray { val songMap = HashMap<String, MutableList<Song>>() val songPlayMap = HashMap<String, Int>() genres.forEachIndexed { index, genre -> val song = Song(index, plays[index]) if (songMap[genre] !== null) { songMap[genre]?.add(song) } else { songMap[genre] = mutableListOf(song) } songPlayMap[genre] = (songPlayMap[genre] ?: 0) + plays[index] } songMap.forEach { it.value.sortByDescending { v -> v.play } } var answer = mutableListOf<Int>() songPlayMap.toList().sortedWith(compareByDescending { it.second }).forEach { val songList = songMap[it.first] val indexFilteredSongList = songList?.filterIndexed { index, song -> index < 2 } if (indexFilteredSongList != null) { answer.addAll(indexFilteredSongList.map { song -> song.id }) } } return answer.toIntArray() } } data class Song( var id: Int, var play: Int )