반응형
풀이
두 개의 사전을 만들어 하나는 각 장르별 총 재생된 횟수를 담아두고 나머지 하나에는 각 장르별의 각 곡의 재생 횟수와 고유 번호를 담아두었다.
총 재생된 횟수를 담아놓은 사전을 정렬하여 많이 재생된 순으로 장르를 갖고 와서 해당 장르의 곡들중에서 가장 많이 재생된 곡을 2개 뽑아서 answer 배열에 담아준다.
코드
[Swift]
import Foundation
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
var answer: [Int] = []
var genrePlayTime: [String: Int] = [:] // 장르별 재생 횟수를 기록하기 위한 사전
var songPlayTime: [String: [(Int, Int)]] = [:] // 장르별 재생된 노래를 담아두는 사전 (재생 횟수, 고유 번호)
// 입력으로 주어진 노래들을 사전에 담아주는 작업을 한다.
for i in 0..<genres.count {
let genre: String = genres[i]
let play: Int = plays[i]
if let value = genrePlayTime[genre] {
genrePlayTime[genre] = value + play
} else {
genrePlayTime[genre] = play
}
if let value = songPlayTime[genre] {
songPlayTime[genre] = value + [(play, i)]
} else {
songPlayTime[genre] = [(play, i)]
}
}
// 많이 재생된 순으로 정렬
let sortedGenrePlayTime = genrePlayTime.sorted { $0.value > $1.value }
// 해당 장르 내에서 많이 재생된 노래 수록
for (key, _) in sortedGenrePlayTime {
let sortedPlayTime = songPlayTime[key]!.sorted { $0.0 > $1.0 } // 해당 장르의 재생 횟수로 곡들을 정렬
for i in 0..<sortedPlayTime.count {
if i == 2 { // 두 개까지만 수록
break
}
answer.append(sortedPlayTime[i].1)
}
}
return answer
}
[Python]
from collections import defaultdict
import heapq
def solution(genres, plays):
answer = []
genrePlayTime = defaultdict(int) # 장르별 재생 횟수를 기록하기 위한 사전
songPlayTime = defaultdict(list) # 장르별 재생된 노래를 담아두는 사전 (재생 횟수, 고유 번호)
# 입력으로 주어진 노래들을 사전에 담아주는 작업을 한다.
for i in range(len(genres)):
genre = genres[i]
play = plays[i]
genrePlayTime[genre] += play
heapq.heappush(songPlayTime[genre], (-play, i))
# 많이 재생된 순으로 정렬
# 해당 장르 내에서 많이 재생된 노래 수록
for (key, _) in sorted(genrePlayTime.items(), key=lambda x: x[1], reverse=True):
for i in range(2): # 두 개까지만 수록
if len(songPlayTime[key]) == 0:
break
(_, idx) = heapq.heappop(songPlayTime[key])
answer.append(idx)
return answer
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[고득점 Kit(힙)] 디스크 컨트롤러 (Swift, Python) (0) | 2022.01.28 |
---|---|
[고득점 Kit(힙)] 더 맵게 (Python) (0) | 2022.01.27 |
[고득점 Kit(해시)] 위장 (Swift, Python) (0) | 2022.01.24 |
[고득점 Kit(해시)] 전화번호 목록 (Python) (0) | 2022.01.22 |
[고득점 Kit(해시)] 완주하지 못한 선수 (Python) (0) | 2022.01.20 |
댓글