알고리즘[Python]/프로그래머스

[ Lv 3 ] 베스트앨범

병훈1234 2021. 7. 16. 23:28

풀이 과정


  1. 합계를 구하는 용인 딕셔너리(1)와, 각 장르별 노래를 저장할 딕셔너리(2)가 필요하다.

  2. 각 장르의 합계를 구할 때 순차적으로 방문하며 딕셔너리를 사용하여 더하고, 합계를 구함과 동시에 장르별 딕셔너리에 해당 노래를 넣어준다.

  3. (1)의 딕셔너리의 items를 사용하여 키,값을 모두 받아온 다음, 값별로 내림차순 정렬해 준다. 이 때 키에는 장르, 값에는 합계가 들어 있다.

  4. (1)의 items를 순차적으로 방문하면서(내림차순), (2)의 딕셔너리를 (1)의 key를 사용해서 받아온다. 이 때 받아오는 리스트에는 (재생횟수, 인덱스)형식으로 들어있으므로 받아있는 리스트 역시 재생횟수로는 내림차순, 인덱스로는 오름차순으로 정렬해 준다.

  5. 앞에서 2개까지만 answer에 저장해준다.


def solution(genres, plays):
    answer = []
    count_hash = {key:0 for key in set(genres)}
    list_hash = {key:[] for key in set(genres)}

    for idx, genre in enumerate(genres):
        count_hash[genre] += plays[idx]
        list_hash[genre].append([plays[idx], idx])

    temp = list(count_hash.items())
    temp.sort(key = lambda x:x[1], reverse=True)
    for key, _ in temp:
        cnt_list = list_hash[key]
        cnt_list.sort(key = lambda x:(-x[0], x[1]))
        for i, (_, idx) in enumerate(cnt_list):
            answer.append(idx)
            if i == 1: # 두개만
                break

    return answer

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges