반응형

문제풀이

 주어진 조건에 맞게 정렬하는 문제이다. 

 1. 장르별로 각 곡이 몇 번 재생되었는지를 가지고 있는 딕셔너리(g_songs)와 각 장르가 총 몇번 재생되었는지를 가지고 있는 딕셔너리(g_num)을 선언한 뒤, 주어진 genres와 plays에서 하나씩 꺼내며 적절히 넣는다.

* g_songs는 key 가 장르명이고 value는 (곡 번호, 재생수))인 튜플들로 이루어진 리스트이다.

* g_num은 key가 장르명이고 value는 그 장르의 모든 곡들의 재생수의 합이다.

 

 2. 주어진 곡들을 모두 넣은 후, g_num의 key를 value에 따라 정렬한다. (정렬의 첫번째 조건인 "속한 노래가 많이 재생된 장르를 먼저 수록합니다."를 먼저 수행)

 3. 2에서 정렬된 순서대로 각 장르별로 g_songs에서 value들을 가져와 각 곡의 재생수인 튜플의 두번째 요소로 정렬한 후, 같다면 곡 번호인 튜플의 첫번째 요소로 정렬해 준다. (정렬의 두, 세번째 조건 수행)

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from functools import cmp_to_key
 
def comparator(x, y):
    if x[1< y[1] : 
        return 1 
    elif x[1> y[1] :
        return -1
    else :
        if x[0< y[0] :
            return -1
        else :
            return 1
            
def solution(genres, plays):
    g_songs = {}
    g_num = {}
 
    for i in range(len(plays)):
        if genres[i] in g_songs :
            temp= g_songs[genres[i]]
            temp.append([i,plays[i]])
            g_songs[genres[i]] = temp
            g_num[genres[i]] = g_num[genres[i]] + plays[i]
        else :
            g_songs[genres[i]] = [[i,plays[i]]]
            g_num[genres[i]] = plays[i]
 
    genre_set = list(g_num.keys())
    genre_set.sort(key=lambda el:g_num[el], reverse=True)
 
    best = []
    
    for g in genre_set:
        temp = sorted(g_songs[g], key=cmp_to_key(comparator))
        if len(temp)==1:
            best.append(temp[0][0])
        else :
            for i in range(2):
                best.append(temp[i][0])
    return best
cs

Line 3의 comparator 함수는 과정 3을 수행하는 함수로 cmp_to_key 를 이용하여 line 34에서 sort함수의 key로 활용됩니다.

Line 18 의 i는 각 곡의 고유 번호로, for문은 과정 1을 수행합니다.

Line 28 ~ 29는 과정 2의 장르를 장르별 총 재생수로 정렬하는 과정입니다.

Line 34는 장르별로 해당 곡들을 꺼내와 정렬하는 과정입니다.

문제 링크

 

프로그래머스

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

programmers.co.kr

 

반응형

+ Recent posts