[스위프트, 파이썬][Programmers][LV3] 베스트앨범 (해시, 정렬)

Date:     Updated:

Categories:

Tags:

🧞‍♂️ 난이도

LV3


🧞‍♂️ 문제

https://programmers.co.kr/learn/courses/30/lessons/42579


🧞‍♂️ 풀이 방법

시키는대로 구현하면 된다. 딕셔너리 두개 사용해서

  • 장르별 총 재생 수
  • 장르별 곡 정보 (재생수, 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
}


맨 위로 이동하기

boj 카테고리 내 다른 글 보러가기

첫 번째 글입니다 가장 최근 글입니다