💬 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579
💬 Idea
- struct 구조체를 만들어 음악 정보를 저장해준다.
- genreDict를 만들어 재생횟수를 저장해준다
- 최대 재생횟수를 가지는 장르 순위대로 베스트앨범을 채운다.
- 가장 많이 재생된 장르
- 해당 장르 중 가장 많이 재생된 노래
- 재생횟수가 같다면 고유번호 낮은 순으로 정렬
💬 풀이
import Foundation
structMusic{vargenre:StringvarplayCnt:Intvarindex:Int}func solution(_ genres:[String], _ plays:[Int])->[Int]{vargenreDict:[String:Int]=[:]varmusics:[Music]=[]varalbum:[Int]=[]for(idx, genre)in genres.enumerated(){
musics.append(Music(genre: genre, playCnt:plays[idx], index: idx))ifgenreDict[genre]==nil{genreDict[genre]=plays[idx]}else{genreDict[genre]! +=plays[idx]}}
musics = musics.sorted(by:{if $0.playCnt == $1.playCnt {return $0.index < $1.index
}else{return $0.playCnt > $1.playCnt
}})foriin genreDict.sorted(by:{ $0.value > $1.value }){letmusic= musics.filter({ $0.genre == i.key }).map({ $0.index })if music.count >=2{
album +=music[0...1]}else{
album.append(music[0])}}return album
}소요시간 : 23분
💬 더 나은 방법?
- 구조체 배열을 담는 변수를 제거하고 Dictionary에 튜플 형식으로 응용하여 사용
structMusic{varplayCnt:Intvarindex:Int}func solution(genres:[String], plays:[Int])->[Int]{vargenreDict:[String:([Music],Int)]=[:]varalbum:[Int]=[]for(idx, genre)in genres.enumerated(){ifgenreDict[genre]!=nil{genreDict[genre]!.0.append(Music(playCnt:plays[idx], index: idx))genreDict[genre]!.1+=plays[idx]}else{genreDict[genre]=([Music(playCnt:plays[idx], index: idx)],plays[idx])}}foriin genreDict.sorted(by:{ $0.value.1> $1.value.1}){letmusic= i.value.0.sorted(by:{return($0.playCnt == $1.playCnt)? $0.index < $1.index : $0.playCnt > $1.playCnt
}).map({ $0.index })
album += music.count >=2?music[0...1]:[music[0]]}return album
}
💬 문제https://school.programmers.co.kr/learn/courses/30/lessons/42579
💬 Idea💬 풀이소요시간: 23분💬 더 나은 방법?