본문 바로가기
알고리즘/hash

[Hash] 프로그래머스 : 베스트 앨범 - 파이썬 Python

by 코딩균 2022. 3. 23.

https://programmers.co.kr/learn/courses/30/lessons/42579?language=python3 

 

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

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

programmers.co.kr

생각하기

  1. 먼저 장르에 따라 dictionary에 해당 장르에 속하는 노래 idx를 분류
  2. 각 장르 딕셔너리를 돌면서 장르별 play 횟수를 counting
  3. 가장 높은 play 횟수를 가진 장르부터 각 노래 plays와 idx 기준으로 정렬
  4. 정렬된 list를 answer에 추가

 

구현하기

dictionary : {장르 : [idx의 리스트]} 로 구성된 dictionary

plays_count : {장르 : 장르에 속한 노래들의 plays 합} 로 구성된 dictionary

sorted_count : plays_count를 2번째 인자 기준으로 내림차순 정렬한 튜플 (dictionary를 정렬할 때, 튜플로 변환하기 때문에 튜플을 반환)

 

유의점

각 장르내에서 노래들을 정렬할 때의 문제에서 제시한 규칙은 아래와 같다

해당 부분을 sort할 때, 잘못 세팅해줘서 조금 시간이 걸렸다

  • 장르 내에서 가장 많이 재생된 노래 : 내림 차순
  • 재생된 노래가 같은 경우 idx 오름차순

두개의 기준이 다르므로 한쪽에 - 를 붙여주어야 한다

dictionary[g[0]].sort(key = lambda x : (plays[x], -x), reverse=True)

sort의 기본 정책은 내림차순 (reverse=True)이고 이에 따라 plays[x] 즉, 노래 재생 횟수에 따라 1차적으로 내림차순 정렬된다

하지만 같은 재생 횟수일 때는, idx 기준으로 내림차순 정렬되어야 하므로

idx들을 음수로 인식하게 하여서 정렬을 시킨다

def solution(genres, plays):
    
    dictionary = {}
    plays_count = {}
    for i in range(len(genres)):
        if genres[i] in dictionary :
            dictionary[genres[i]].append(i)
        else:
            dictionary[genres[i]] = [i]
            
        if genres[i] in plays_count :
            plays_count[genres[i]] += plays[i]
        else:
            plays_count[genres[i]] = plays[i]
#     print(dictionary)
#     print(count)
    
    sorted_count = sorted(plays_count.items(), key = lambda x : x[1], reverse=True)
    # print(sorted_count)
    answer = []
    # 속한 노래가 많이 재생된 장르?
    for g in sorted_count:
        # 장르 내에서 많이 재생된 노래
        # 장르 내에서 재생횟수가 같은 노래 중에서는 id 낮은 노래
        dictionary[g[0]].sort(key = lambda x : (plays[x], -x), reverse=True)
        # print(dictionary[g[0]])
        answer += dictionary[g[0]][0:2]
    
    
    return answer