KEEP GOING

[python] 프로그래머스 42579번 : 베스트 앨범 본문

code review/sort

[python] 프로그래머스 42579번 : 베스트 앨범

jmHan 2021. 12. 29. 14:18
반응형

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

 

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

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

programmers.co.kr

 

 

1. 성공한 코드

def solution(genres, plays):
    answer = []
    # 장르별 고유번호:재생횟수를 담음 
    dic = {}
    n = len(genres)
    for i in range(n):
        genre = genres[i]
        if genre in dic.keys():
            dic[genre][i] = plays[i]
        else:
            dic[genre] = {i: plays[i]}
    # 총 재생횟수가 많은 순으로 (k:v) 정렬 
    dic = dict(sorted(dic.items(), key=lambda x:(-sum(x[1].values()))))
    for k, valueDic in dic.items():
        # 장르별 곡 재생 횟수를 내림차순으로 정렬 
        valueDic = dict(sorted(valueDic.items(), key=lambda x:-x[1]))
        dic[k] = valueDic
    # print(dic)
    # 장르별 상위 2곡만 추출 
    for valueDic in dic.values():
        i = 0
        for k in valueDic.keys():
            answer.append(k)
            i += 1
            if i == 2:
                break

    return answer

 

 

 

2. 코드 개선

from collections import defaultdict

def solution(genres, plays):
    answer = []
    # 장르별 고유번호:재생횟수를 담음
    dic = defaultdict(dict)
    n = len(genres)
    for i, genre in enumerate(genres):
        dic[genre][i] = plays[i]
    # print(dic)
    # 총 재생횟수가 많은 순으로 (k:v) 정렬
    dic = dict(sorted(dic.items(), key=lambda x:(-sum(x[1].values()))))
    for k, valueDic in dic.items():
        # 장르별 곡 재생 횟수를 내림차순으로 정렬
        dic[k] = dict(sorted(valueDic.items(), key=lambda x:-x[1]))
    # print(dic)
    # 장르별 상위 2곡만 추출
    for valueDic in dic.values():
        for idx, k in enumerate(valueDic.keys()):
            answer.append(k)
            if idx == 1:
                break
    # print(answer)
    return answer

반응형
Comments