프로그래머스 코딩테스트 고득점 Kit_해시_베스트앨범

Minhee kang·2021년 8월 12일
0

문제 보러 가기 👈 클릭!

💡 풀이

✔ 풀이 방법 1

{장르: [(재생횟수, 노래번호)], ...} 와 같이 장르별로 노래의 재생횟수와 번호를 모아놓은 딕셔너리를 만든다.

총 재생횟수가 가장 많은 순으로 장르를 나열 해 놓은 리스트 genre_sort를 만든다.

genre_sort를 반복하며 해당 장르의 노래들을 가장 많이 재생한순으로 정렬한 후, 노래번호로 정렬한다. 또한 해당 장르별로 가장 많이 재생한 2개의 노래를 앨범(answer)에 추가한다.

구현 코드👇

#장르별 가장 많이 재생된 노래를 2개씩 모아 베스트앨범 만듬
#총 재생횟수가 가장 많은 장르부터 수락함(가장 횟수가 많은 곡 부터, 횟수 같으면 고유번호 작은것 부터 수락)
from collections import defaultdict
def solution(genres, plays):
    answer = []
    
    play_cnt = defaultdict(int)  #play_cnt = {장르: 해당 장르 노래 총 재생횟수}
    genre_dict = defaultdict(list) #genre_dict = {장르: [(재생횟수, 노래고유번호),..] }
    for i, genre, play_n in zip(range(len(genres)), genres, plays):
        play_cnt[genre] += play_n
        genre_dict[genre].append((play_n, i))
        
    #genre_sort = 총 재생횟수가 가장 높은순으로 장르가 담겨있는 list
    genre_sort = sorted(list(play_cnt.keys()), key = lambda x: -play_cnt[x])
    
    for genre in genre_sort:
        #genre_dict의 값들을 가장 많이 재생된순으로 정렬 후, 노래번호가 가장 적은순으로 정렬
        genre_dict[genre].sort(key = lambda x: (-x[0], x[1]))
        #장르별로 노래 2개를 앨범에 추가
        answer.extend([song_n for play_n, song_n in genre_dict[genre][:2]])
    
    return answer

✔ 풀이 방법 2

구현 코드👇

#장르별 가장 많이 재생된 노래를 2개씩 모아 베스트앨범 만듬
#총 재생횟수가 가장 많은 장르부터 수락함(가장 횟수가 많은 곡 부터, 횟수 같으면 고유번호 작은것 부터 수락)
from collections import defaultdict
def solution(genres, plays):
    answer = []
    
    #genre_dict = {장르: [(재생횟수, 노래고유번호),..] }
    genre_dict = defaultdict(list)   
    for i, genre, play_n in zip(range(len(genres)), genres, plays):
        genre_dict[genre].append((play_n, i))
        
    #genre_sort = 총 재생횟수가 가장 높은순으로 장르가 담겨있는 list
    genre_sort = sorted(list(genre_dict.keys()), key = lambda x: -sum(map(lambda y: y[0], genre_dict[x])))
    
    for genre in genre_sort:
        #genre_dict의 값들을 가장 많이 재생된순으로 정렬 후, 노래번호가 가장 적은순으로 정렬
        genre_dict[genre].sort(key = lambda x: (-x[0], x[1]))
        #장르별로 노래 2개를 앨범에 추가
        answer.extend([song_n for play_n, song_n in genre_dict[genre][:2]])
    
    return answer

📝 두 풀이는 genre_sort를 구하는 점이 다름
=> 풀이방법2가 더 간결하지만 풀이방법1이 가독성이 좋다

0개의 댓글