문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 

노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.

1) 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
2) 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
3) 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.


노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 

베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 

 

(출처 : 프로그래머스)

 

입출력 예

genres plays return
["classic", "pop", "classic", "classic", "pop"] [500, 600, 150, 800, 2500] [4, 1, 3, 0]

 

classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.
고유 번호 3: 800회 재생
고유 번호 0: 500회 재생
고유 번호 2: 150회 재생


pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.
고유 번호 4: 2,500회 재생
고유 번호 1: 600회 재생


따라서 pop 장르의 [4, 1]번 노래를, classic 장르의 [3, 0]번 노래를 차례대로 return 합니다.

 

 

풀이

from collections import defaultdict as dd

def solution(genres, plays):
    answer = []
    gcac=dd(int) #calc
    gd=dd(list) #dict
    
    for i,v in enumerate(genres):
        gcac[v]+=plays[i]
        gd[v].append((i,plays[i]))
        
    gcac=sorted(gcac.items(),key=lambda x:x[1], reverse=True) #장르:플레이수합 
    #print('gcac: ',gcac)
    
    for name,total in gcac:
        gd[name]=sorted(gd[name],key=lambda x:x[1],reverse=True)
        #print('gd[',name,']',gd[name]) #[(4, 2500), (1, 600)]
        
        for idx in range(2):
            if idx==len(gd[name]): break
            answer.append(gd[name][idx][0])
    
    return answer

 

 

int형 defaultdict를 선언해 장르별 플레이 횟수를 집계했고 (gcac)

list형 defaultdict에 plays 배열의 장르별 플레이 횟수와 인덱스를 넣어주었다. (gd)

 

gcac을 플레이 횟수가 많은 순으로 정렬한 뒤 

gd에 플레이를 많이한 장르부터 접근해 리스트를 플레이 수 역순으로 정렬했다.

 

리스트 정렬 후 최대 2개까지 정렬된 리스트에서 인덱스를 answer에 추가해주었다.

 

 

앙큼한 성공

반응형

+ Recent posts