[해시] 베스트앨범 (프로그래머스, Level 3) - 딕셔너리 정렬 (Retry)

Soorim Yoon·2022년 10월 12일
0
post-thumbnail

문제

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

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

노래 수록 기준

  • 재생된 음악의 장르 정보가 담긴 genres 배열, 재생 횟수가 담긴 plays 배열이 있다.
  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

⇒ 위 규칙에 따라 음악이 재생되는 순서대로 고유 번호를 정렬해 리턴해라.

코드

def solution(genres, plays):
    answer = []

    total = {}      # 장르 별 총 재생 횟수
    gen_dic = {}    # 장르별 [재생횟수, 고유번호] 배열을 value로 가지는 딕셔너리

    # total 딕셔너리 생성
    for i in range(len(genres)):
        if genres[i] not in total:      # 딕셔너리에 해당 음악 종류가 없는 경우 새로 추가
            total[genres[i]] = plays[i]
            gen_dic[genres[i]] = [(plays[i], i)]
        else:       # 딕셔너리에 해당 음악 종류가 있는 경우, 그대로 새로운 정보를 append 또는 값을 더함
            total[genres[i]] += plays[i]
            gen_dic[genres[i]].append((plays[i], i))

    # total 딕셔너리 정렬 (조회 수 기준으로)
    total = sorted(total.items(), key = lambda x : x[1], reverse = True)

    # 전체 조회수 순으로 정렬된 total 배열의 key를 활용해서 각 장르의 [조회수, 고유번호] 정보를 배열로 저장함
    # 전체 조회수가 높은 -> 낮은 순으로 playlist 배열에 값이 저장됨
    for key in total:
        playlist = gen_dic[key[0]]      # 딕셔너리의 value 값인 [조회수, 고유번호] 배열을 모두 가져와 저장
        # 조회수 순으로 [조회수, 고유번호] 배열을 정렬
        playlist = sorted(playlist, key = lambda x: x[0], reverse = True) 
        for i in range(len(playlist)):      
            if i < 2:
                answer.append(playlist[i][-1])
            else:
                break
        # for 문이 한 번 돌 때마다, playlist 배열에는 한 장르의 (재생수, 고유번호) 정보가 재생 수를 기준으로 내림차순 정렬됨
        # 정렬된 playlist 배열을 앞에서부터 두 개씩 answer 배열에 저장 (두 개 넘어가면 break를 통해 다음 장르로 넘어가도록 설정)

    return answer

코드 실행 결과

  • total, gen_dic 출력

오류 코드

예전에 풀었던 문제를 다시 풀어보는데, 다음과 같이 코드를 작성하니 오답이 출력되었다. 그 이유를 파악중이다. (2022.10.12)

from collections import defaultdict
def solution(genres, plays):
    answer = []
    
    total = defaultdict(int)
    gen_dict = defaultdict(list)
    
    for g in range(len(genres)):
        total[genres[g]] += plays[g]
        gen_dict[genres[g]].append((plays[g], g))
    
    total = sorted(total.items(), key = lambda x : x, reverse = True)
    
    for key in total:
        playlist = gen_dict[key[0]]     # 많이 재생된 장르 순서대로 playlist에 그의 value 값을 저장

        playlist.sort(key = lambda x : x[0], reverse = True)
        answer.append(playlist[0][-1])
        answer.append(playlist[1][-1])
            
    return answer

실행 결과


profile
👩🏻‍💻 AI를 좋아하는 IT학부생

0개의 댓글