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

해시


정렬 기준이 많고 까다로워서 구현 난이도 자체가 어려운 문제

설명은 소스코드의 주석으로 대체

def solution(genres, plays):
    answer = []
    n = len(genres)   # 장르의 개수를 n으로 설정
    table = dict()    
    # {"key": [[-1, total], [고유번호, play], [고유번호, play]]}
    # 첫 원소로 total값을 계속 더해주어 나중에 장르 순서로 정렬하기 좋게 구현
        for i in range(n):
        # 이미 테이블에 해당 장르가 있다면
        if genres[i] in table:
            # 해당 장르 total play 연산
            table[genres[i]][0][1] += plays[i]
            # dictionary의 value list 불러와서
            tmp_list = table[genres[i]]
            # 상위 2개가 아직 차지 않았다면 그냥 더함
            if len(tmp_list) < 3:
                tmp_list.append([i, plays[i]])
            # 상위 2개가 이미 차있고 새로운 play가 같은 카테고리에 들어간 경우
            else:
                # play수가 기존 가장 작은 애보다 높으면 대체
                if tmp_list[2][1] < plays[i]:
                    tmp_list[2][0] = i
                    tmp_list[2][1] = plays[i]
            # 대체하고 정렬
            tmp_list.sort(key=lambda x: x[1], reverse=True)
        # 테이블에 해당 장르가 아직 없는 경우 initialize
        else:
            table[genres[i]] = [[-1, plays[i]], [i, plays[i]]]
    # 그렇게 해서 구현된 value list를 추출
    value_list = list(table.values())
    # total play 값으로 내림차순 정렬
    value_list.sort(key=lambda x: x[0][1], reverse=True)
    # answer에 값 옮긴다. 1개이거나 2개일 수 있으므로 len(e)로 구현
    for e in value_list:
        for i in range(1, len(e)):
            answer.append(e[i][0])
    return answer