[스위프트, 파이썬][Programmers][LV3] 베스트앨범 (해시, 정렬)
Categories: boj
🧞♂️ 난이도
LV3
🧞♂️ 문제
🧞♂️ 풀이 방법
시키는대로 구현하면 된다. 딕셔너리 두개 사용해서
- 장르별 총 재생 수
- 장르별 곡 정보 (재생수, id)
정리를 해놓고, 적절히 정렬해서 정답 찾으면 된다.
🧞♂️ 파이썬 코드
from collections import defaultdict
def solution(genres, plays):
genre_total = defaultdict(int)
genre_songs = defaultdict(list)
for i in range(len(genres)):
genre_total[genres[i]] += plays[i]
genre_songs[genres[i]].append((plays[i], i))
for genre in genre_songs.keys():
genre_songs[genre].sort(key=lambda x: (-x[0], x[1]))
answer = []
for genre, _ in sorted(genre_total.items(), key=lambda x: -x[1]):
for i in range(2):
songs = genre_songs[genre]
if i < len(songs):
answer.append(songs[i][1])
return answer
🧞♂️ 스위프트 코드
import Foundation
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
typealias Song = (plays: Int, id: Int)
var genre_total: [String: Int] = [:]
var genre_songs: [String: [Song]] = [:]
// 해시 setup
for i in 0..<genres.count {
let genre = genres[i]
let plays = plays[i]
genre_total[genre, default: 0] += plays
genre_songs[genre, default: []].append(Song(plays: plays, id: i))
}
// 장르별 노래 정렬
for (genre, songs) in genre_songs {
let songs = songs.sorted(by: {
if $0.plays == $1.plays {
return $0.id < $1.id
}
return $0.plays > $1.plays
})
genre_songs[genre, default: []] = songs
}
// 장르 정렬
let orderedGenres = genre_total
.map { ($0.0, $0.1) }
.sorted(by: {
$0.1 > $1.1
})
.map { $0.0 }
var answer: [Int] = []
// 각 장르별 2곡 정답에 추가
orderedGenres
.forEach {
for i in 0..<2 {
let songs = genre_songs[$0, default: []]
if i < songs.count {
answer.append(songs[i].id)
}
}
}
return answer
}