알고리즘/programmers

[ programmers ] 베스트앨범 42579번 ( python )

Yanoo 2021. 8. 21. 01:04
728x90
반응형

문제

프로그래머스 42579번 베스트앨범 풀이 ( 파이썬 )

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

 

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

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

programmers.co.kr

 

 

풀이

재생된 수와 고유번호가 담긴 dict과 각 장르의 합을 저장하는 dict을 나누었다.

먼저 장르의 합을 저장하는 dict을 내림차순으로 정렬한 후 이 순서대로 탐색을 시작한다.

genres_sum = sorted(genres_sum.items(), key = lambda x:x[1], reverse = True)

 

탐색을 시작하기 전에 재생된 수와 고유번호를 담은 dict을 첫 번째 인덱스(재생된 수)는 내림차순, 두 번째 인덱스(고유번호)는 오름차순으로 정렬해야 한다.

for key in genres_dict.keys():
	genres_dict[key].sort(key = lambda x:(-x[0], x[1]))

 

이제 전체 코드를 보면 마지막은 장르가 2개 이상일 때와 1개일 때로 구분해서 answer라는 리스트에 넣으면 된다.

def solution(genres, plays):
    answer = []

    genres_dict = dict()

    genres_sum = dict()

    for i in range(len(genres)):
        genres_dict[genres[i]] = genres_dict.get(genres[i], []) + [(plays[i], i)]
        genres_sum[genres[i]] = genres_sum.get(genres[i], 0) + plays[i]

    genres_sum = sorted(genres_sum.items(), key = lambda x:x[1], reverse = True)

    for key in genres_dict.keys():
        genres_dict[key].sort(key = lambda x:(-x[0], x[1]))
    
    for genre in genres_sum:
        if len(genres_dict[genre[0]]) > 1:
            for i in range(2):
                cnt, idx = genres_dict[genre[0]][i]
                answer.append(idx)
        else:
            cnt, idx = genres_dict[genre[0]][0]
            answer.append(idx)
    return answer
728x90
반응형