문제:

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

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

노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

풀이 방법:

 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays를 노래를 수록하는 기준에 따라서 해시로 구성해서 풀어야 하는 문제이다.


 우선 기준 1에 의해 속한 노래가 많이 재생된 장르를 먼저 수록해야 하므로 장르별로 재생된 횟수를 나타내는 해시인 sum_set을 만들어야 한다. 이와 동시에 기준 2 장르 내에서 많이 재생된 노래를 먼저 수록해야 하므로 장르를 key 값으로 가지고 그 장르의 노래별 재생 횟수를 리스트를 value 값으로 가지는 해시인 playlist_set을 만들도록 한다. 문제에서 제공하는 입출력 예시를 정리해보면 다음과 같이 만들어 진다.


sum_set= {'classic': 1450, 'pop': 3100} playlist_set={'classic': [500, 150, 800], 'pop': [600, 2500]}


sum_set의 item 리스트를 가져와서 value 값을 기준으로 정렬을 한 뒤에 정렬된 key 값으로 playlist_set에 접근을 하도록 한다. playlist_set의 value 값을 정렬한 뒤에 맨 뒤의 두 값이 최대값들이므로 이를 이용해서 plays에서 인덱스 값을 찾아서 answer에 넣어주면 된다. 다만 기준 3에 의해서 재생 횟수가 같다면 고유 번호가 낮은 노래를 먼저 수록해야 하므로 최대값들이 같을 때와 다를 때를 구분해서 넣어주면 된다. plays에서 인덱스 값을 찾는 것은 index 내장함수를 사용했다. index 내장 함수는 시작점을 지정해줄 수 있으므로 재생 횟수가 같다면 두번째 최대값은 첫번째 최댓값의 인덱스 이후로 탐색하면 되기 때문이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def solution(genres,plays):
    sum_set={}
    playlist_set={}
    answer=[]
    for i in range(len(genres)):
        if genres[i] in sum_set:
            sum_set[genres[i]]+=plays[i]
            playlist_set[genres[i]].append(plays[i])
        else:
            sum_set[genres[i]]=plays[i]
            playlist_set[genres[i]]=[plays[i]]
    sum_list=sorted(list(sum_set.items()),key=lambda x:x[1],reverse=True)
    for i in sum_list:
        temp=sorted(playlist_set[i[0]])
        if len(temp)>=2:
            if temp[-1]==temp[-2]:
                answer.append(plays.index(temp[-1]))
                answer.append(plays.index(temp[-2],plays.index(temp[-1])+1))
            else:
                answer.append(plays.index(temp[-1]))
                answer.append(plays.index(temp[-2]))
        else:
            answer.append(plays.index(temp[0]))
    return answer
cs


'Algorithm > Python' 카테고리의 다른 글

[Programmers] Lv 3. 멀리 뛰기  (0) 2019.03.11
[Programmers]Lv 2.폰켓몬  (0) 2019.03.10
[Programmers]Lv 2.땅따먹기  (0) 2019.03.08
[Programmers] Lv 3. 등굣길  (2) 2019.03.07
[Programmers]Lv 2.다음 큰 숫자  (0) 2019.03.06

+ Recent posts