스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 모아 베스트 앨범을 출시하려고 한다.
조건은 다음과 같다:
1. 속한 노래가 많이 재생된 장르를 먼저 수록
2. 장르 내에서 많이 재생된 노래를 먼저 수록
3. 재생 수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록
4. 각 장르에는 최대 2곡만 수록
예를 들어,
genres = ["classic", "pop", "classic", "classic", "pop"],
plays = [500, 600, 150, 800, 2500]
이면, pop이 먼저 오고, 그 다음 classic 순으로, 결과는 [4, 1, 3, 0]
genres[i]: 고유번호가 i인 노래의 장르plays[i]: 고유번호가 i인 노래가 재생된 횟수genres와 plays 길이는 1 이상 10,000 이하이며, 길이는 항상 같음장르별로 곡 정보를 묶어 저장
genrePlay 딕셔너리에 장르를 키로, (index, plays)를 값으로 저장
장르 내 곡 정렬
같은 장르 내에서는 재생 수 기준 내림차순으로, 같으면 index 오름차순으로 정렬
장르별 총 재생 수로 정렬
장르 전체의 재생 수 합을 구한 후, 많이 재생된 장르 순으로 정렬
장르마다 최대 2곡을 선택
각 장르에서 상위 2곡만 결과 배열에 추가
import Foundation
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
// 1. 장르별 곡 정보 저장
var genrePlay: [String: [(index: Int, plays: Int)]] = [:]
for (index, genre) in genres.enumerated() {
genrePlay[genre, default: []].append((index, plays[index]))
}
// 2. 장르 내 곡 정렬
for (genre, songs) in genrePlay {
genrePlay[genre] = songs.sorted {
if $0.plays != $1.plays {
return $0.plays > $1.plays
} else {
return $0.index < $1.index
}
}
}
// 3. 장르별 총 재생 수 기준 정렬
let genrePlayCount = genrePlay
.mapValues { $0.reduce(0) { $0 + $1.plays } }
.sorted { $0.value > $1.value }
// 4. 각 장르별 최대 2곡 수록
var result: [Int] = []
for genre in genrePlayCount {
if let songs = genrePlay[genre.key] {
for song in songs.prefix(2) {
result.append(song.index)
}
}
}
return result
}