본문 바로가기
Algorithm/Programmers

[고득점 Kit(해시)] 베스트앨범 (Swift, Python)

by 원만사 2022. 1. 26.
반응형

 

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 

풀이

 두 개의 사전을 만들어 하나는 각 장르별 총 재생된 횟수를 담아두고 나머지 하나에는 각 장르별의 각 곡의 재생 횟수와 고유 번호를 담아두었다. 

 

 총 재생된 횟수를 담아놓은 사전을 정렬하여 많이 재생된 순으로 장르를 갖고 와서 해당 장르의 곡들중에서 가장 많이 재생된 곡을 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
반응형

댓글