[Python3]프로그래머스_베스트앨범

Beanzinu·2022년 1월 27일

코딩테스트

목록 보기
11/42

문제출처: https://programmers.co.kr/learn/courses/30/lessons/42579

접근법

  1. dict1에 key를 genre로 하고 (자신의 고유번호,재생된 횟수) 형태의 리스트로 저장한다.
  2. 그리고 또 다른 dict2에 각 genre별로 재생된 횟수를 누적하여 저장한다.
  3. dict1에 value들은 재생된 횟수를 기준으로 정렬해준다.
  4. dict2를 재생된 횟수를 내림차순으로 정렬하여 각 키에 대하여 for문을 돌면서 ( dict1에 해당하는 value = list 이므로 ) index 0,1 ( 상위 2곡) 만 answer에 추가한다.
  • defaultdict를 활용하면 없는 키에 대하여 값을 저장할 때 초기화 과정이 따로 필요없다. ( 코드 부분에서 list([]) 또는 int 로 초기화 시켰다. )
  • dict.items() 를 sorted 함수를 통해 미리 정렬하여 쉽게 key,val를 내림차순 형태로 얻을 수 있었다.
  • sorted 함수를 "[:2]"와 같은 index slicing을 통해 효율적으로 상위 2곡을 정답에 추가할 수 있었다.

처음에도 통과는 했지만 매우 비효율적이고 복잡한 코드들이였다.
정답자들의 코드를 보며 아직 부족한 부분들이 많고 항상 더 나은 코드를 생각하는 습관이 필요할 것 같다.

코드

from collections import defaultdict
def solution(genres, plays):
    answer = []
    d = defaultdict(list)
    rank = defaultdict(int)
    
    for index,(i,j) in enumerate(zip(genres,plays)):
        d[i].append( (j,index) )
        rank[i] += j
        
    for key,val in sorted(rank.items(),key=lambda x:x[1],reverse=True):
        for k,v in sorted(d[key],key=lambda x:x[0],reverse=True)[:2]:
            answer.append(v)
        
    # rank = []
    # for key,val in zip(d,d.values()):
    #     val.sort(key=lambda x:x[0],reverse=True) # 장르 안 노래들 정렬
    #     s = 0
    #     for t in val:
    #         s += t[0]
    #     rank.append( (key,s) ) 
    # rank.sort(key=lambda x:x[1],reverse=True)
    
    # for r in rank:
    #     genre = r[0]
    #     if( len(d[genre]) > 1 ):
    #         answer.extend( [d[genre][0][1],d[genre][1][1]] )
    #     else:
    #         answer.append( d[genre][0][1] )
    
    return answer
profile
당신을 한 줄로 소개해보세요.

0개의 댓글