https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
해설
문제 제목에 나와있듯 해시맵으로 풀었다!
총 2개의 해시맵을 사용하였는데,
- 장르별 재생수 합계를 위한 해시맵 (album)
- 장르별 순위안에서 노래별 재생수 합계를 위한 해시맵이다. (genreMap)
문제 자체는 매우 쉬웠던 것 같다.
딱히 해설할 것이 없어 그냥 코드 설명을 하려고 한다,,!👍
우선 map.getOrDefault
라는 메서드를 사용하였는데,
이는 값이 있으면 가져오고 없으면 Default로 지정된 값을 가져오는 함수이다.
for(i in genres.indices){
album[genres[i]] = album.getOrDefault(genres[i], 0) + plays[i]
}
위처럼 사용하면 새로운 (key, value)
는 album에 추가되고,
이미 존재하는 (key, value)
는 기존 key의 value값에 play[i]를 더한값으로 업데이트된다.
코틀린에서 해시맵을 정렬하기 위해서는 List로 변환 후 정렬하고나서 다시 Map으로 변환해야 한다.
var sortAlbum = album.toList().sortedByDescending { it.second }.toMap().toMutableMap()
전체코드는 아래에!
class BestAlbum {
fun solution(genres: Array<String>, plays: IntArray): MutableList<Int> {
var answer = intArrayOf()
var album = mutableMapOf<String, Int>()
var ana = mutableListOf<Int>()
for(i in genres.indices){
album[genres[i]] = album.getOrDefault(genres[i], 0) + plays[i]
}
//앨범을 value값으로 내림차순 정렬
var sortAlbum = album.toList().sortedByDescending { it.second }.toMap().toMutableMap()
sortAlbum.onEachIndexed { index, entry ->
var (genre, play) = entry.toString().split("=")
var genreMap = mutableMapOf<Int, Int>()
for(i in genres.indices){
if(genre == genres[i]){
genreMap[i] = plays[i]
}
}
//sortAlbum 즉, 가장 재생수가 많은 앨범부터 (원래 genres 배열의 인덱스값, 재생수)를 담아 재생수 기준으로 내림차순 정렬
var sortGenreMap = genreMap.toList().sortedByDescending { it.second }.toMap().toMutableMap()
var cnt = 0
sortGenreMap.onEachIndexed{ index, entry ->
if(cnt < 2){
var (idx, value) = entry.toString().split("=")
ana.add(idx.toInt())
//카운트를 넣어주어 2보다 작을때만 실행됨
cnt++
}
}
}
return ana
}
}
fun main(){
val ba = BestAlbum()
}
내 실력 부족으로 인해 코드가 많이 더럽고 쓸모없어보이는 곳이 많아 보였다....
ChatGPT에게 리펙토링을 부탁하였고 확인해보니 역시 AI는 AI 인가부다,,,,,☹️ 내 머리도 AI만큼만 되었으면 ㅠㅠ
class BestAlbum {
fun solution(genres: Array<String>, plays: IntArray): List<Int> {
// 장르별 총 재생 횟수 계산
val genreTotalPlays = mutableMapOf<String, Int>()
for (i in genres.indices) {
genreTotalPlays[genres[i]] = genreTotalPlays.getOrDefault(genres[i], 0) + plays[i]
}
// 장르별 노래 정보 정리
val songsByGenre = mutableMapOf<String, MutableList<Pair<Int, Int>>>()
for (i in genres.indices) {
songsByGenre.computeIfAbsent(genres[i]) { mutableListOf() }.add(i to plays[i])
}
// 재생 횟수 기준으로 장르 정렬
val sortedGenres = genreTotalPlays.toList().sortedByDescending { it.second }.toMap()
// 결과 저장할 리스트
val result = mutableListOf<Int>()
// 각 장르별로 노래 선택
for ((genre, _) in sortedGenres) {
val songs = songsByGenre[genre] ?: continue
// 재생 횟수 기준으로 내림차순 정렬, 두 개까지 선택
val sortedSongs = songs.sortedByDescending { it.second }.take(2)
// 선택한 노래의 인덱스 추가
result.addAll(sortedSongs.map { it.first })
}
return result
}
}
fun main() {
val ba = BestAlbum()
}
'안찌의 개발일기 > Algorithm' 카테고리의 다른 글
백준 9663 N-Quuen(코틀린) (0) | 2023.10.16 |
---|---|
[백준 5904] Moo 게임 (Kotlin) (1) | 2023.10.11 |
백준 2922 - 즐거운 단어(Kotlin) (1) | 2023.10.10 |
[Kotlin]프로그래머스 level3 - 입국심사(이분탐색) (0) | 2023.09.19 |
[Kotlin] 백준 26260 - 이가빠진 이진트리 (0) | 2023.09.19 |