본문 바로가기

알고리즘/프로그래머스

[프로그래머스 코딩테스트 고득점 Kit / 해시] 베스트 앨범 (python)

728x90

풀이

def solution(genres, plays):
    answer = []
    d = {}                           #{"장르": {고유번호 : 횟수}, {고유번호 : 횟수} ...}
    genre_cnt = {}                   #{"장르" : "전체 횟수"}

    for i in range(len(plays)):      # 중첩 딕셔너리 선언
        d[genres[i]] = {}
        
    for i in range(len(genres)):
        d[genres[i]][i] = plays[i]
        if genres[i] in genre_cnt:
            genre_cnt[genres[i]] += plays[i]
        else:
            genre_cnt[genres[i]] = plays[i]
                
    sorted_genre = sorted(genre_cnt.items(), key=lambda x: x[1], reverse=True)
    
    for i in range(len(sorted_genre)): 
        sorted_d = sorted(d[sorted_genre[i][0]].items(), key=lambda x: (-x[1], x[0])) #횟수는 내림차순, 값은 오름차순
        try:       
            answer.append(sorted_d[0][0])
            answer.append(sorted_d[1][0])
        except IndexError:
            continue
    
    return answer

내 풀이

  • 중첩 딕셔너리 사용
  • 중첩 딕셔너리는 선언과 동시에 값 넣는게 안된다고 해서 선언을 따로 함
  • genre_cnt에 장르별 전체 횟수를 저장하고, 횟수를 내림차순으로 정렬해서 sorted_genre에 저장.(제일 많은 게 젤 앞에 있음)
  • sorted_genre에 저장된 장르 순서대로 answer에 두개씩 집어넣음. 이때, 장르에 노래가 하나 있는 경우 out of list 에러가 발생하므로 try except 문으로 처리.
반응형