알고리즘/프로그래머스

[해시] 베스트앨범

래울 2021. 9. 4. 15:52

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

 

코딩테스트 연습 - 베스트앨범

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

programmers.co.kr

 

1. 인덱스가 key이고, 재생횟수가 value인 딕셔너리dic을 만든다.  #{'0' : 500}

  - {0: 500, 1: 600, 2: 150, 3: 800, 4: 2500}

 

2. 장르가 key이고, 재생횟수 리스트가 value인 딕셔너리 music_dic을 만든다.

  - {'classic': [500, 150, 800], 'pop': [600, 2500]}

 

3. music_dic에 대해 값인 재생횟수 리스트를 내림차순으로 정렬한다.

  - {'classic': [800, 500, 150], 'pop': [2500, 600]}

 

4. music_dic에 장르별 재생횟수의 총합을 내림차순으로 정렬한다.

  - [('pop', [2500, 600]), ('classic', [800, 500, 150])]

 

5. 조건에 맞게 정렬된 music_dic을 차례로 돌며, 장르별 두개씩 추가, 만약 장르 내에서 재생횟수가 같은 노래가 있을 수  있으므로, temp리스트에 해당 재생횟수의 인덱스를 모두 찾아 추가 후, 인덱스 순으로 정렬 후 [:2]까지만 추가

  - if not temp[0] in answer을 하는 이유는, 같은 인덱스 리스트를 중복추가하는 경우를 제외하기 위함이다.

 

def solution(genres, plays):
    dic = {}
    for i in range(len(plays)):
        dic[i] = plays[i]
    music_dic = {}
    _ = 0
    for i in genres:
        music_dic.setdefault(i, [])
        music_dic[i].append(dic[_])
        _ += 1
    for i in music_dic:
        music_dic[i] = sorted(music_dic[i], reverse=True)
    music_dic = sorted(music_dic.items(), key=lambda x: sum(x[1]), reverse=True)
    answer = []
    for i in range(len(music_dic)):
        for j in list(music_dic[i][1][:2]):
            temp = []
            for k in dic:
                if dic[k] == j:
                    temp.append(k)
            if not temp[0] in answer:
                answer += map(int, sorted(temp)[:2])
    return answer