문제풀이
주어진 조건에 맞게 정렬하는 문제이다.
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
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 SQL 중성화 여부 확인하기 (0) | 2020.03.23 |
---|---|
프로그래머스 Lv2 압축 (0) | 2020.03.22 |
프로그래머스 Lv3 타일 장식물 (0) | 2020.03.22 |
프로그래머스 Lv3 N-Queen (0) | 2020.03.22 |
프로그래머스 Lv3. 야근 지수 (0) | 2020.03.05 |