티스토리 뷰

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1. 접근 방식

  • 장르별 재생 수를 누적할 count 딕셔너리와 장르별 가장 많이 재생된 두 곡을 담을 songs 딕셔너리가 필요하다.

count 딕셔너리는 {"classic": 300, "pop": 1500} 모습이고, songs는 {"classic": [1, 3], "pop": [2, 0]} 모습이다. 이때 songs의 value는 길이가 최대 2인 리스트이다.

 

  • 고유번호 i의 재생횟수가 담긴 plays 리스트를 key가 고유번호이고, value가 재생횟수인 딕셔너리로 바꾸고, 이를 재생횟수를 기준으로 정렬한다.

파이썬의 딕셔너리는 원래 순서가 없는 자료형이므로, 재생횟수를 기준으로 정렬하기 위해서는 OrderedDict을 사용해야 한다.

이렇게 생성된 딕셔너리는 (1) 고유 번호 순서대로 정렬된 상태인데, 이를 다시 재생 횟수를 기준으로 정렬하면 (2) 재생 횟수가 많은 순으로도 정렬된다. 즉, 기본적으로 재생 횟수가 높은 순으로 정렬되고, 만약 재생 횟수가 동일할 경우에는 고유 번호가 더 낮은 것의 순서가 먼저이다. 따라서 해당 딕셔너리를 순회하면, songs[장르]에 순서대로 노래의 고유 번호를 넣을 수 있어 편리하다.

 

 

2. 정답 코드

def solution(genres, plays):
    from collections import OrderedDict
    idx = OrderedDict(sorted({i: p for i, p in enumerate(plays)}.items(), key=lambda x: x[1], reverse=True))

    count = {g: 0 for g in set(genres)}
    songs = {g: [] for g in set(genres)}
    for key, value in idx.items():
        count[genres[key]] += value

        if len(songs[genres[key]]) < 2:
            songs[genres[key]].append(key)

    answer = []
    order = OrderedDict(sorted(count.items(), key=lambda x: x[1], reverse=True))
    for key in order.keys():
        answer.extend(songs[key])
    return answer
728x90