[Programmers 42579] 베스트앨범

Updated:

문제

LV3 [Programmers 42579 - 베스트앨범]

문제 풀이 방법

이 문제는 hash와 sorting을 이용하면 쉽게 해결할 수 있다.

  1. genres와 plays 배열을 동시에 돌면서 dic에 ‘장르’ : [전체 장르 재생된 횟수의 합, [재생 횟수, 고유번호]] 형태로 저장한다.
  2. 속한 노래가 가장 많이 재생된 장르를 먼저 수록하므로 전체 장르 재생 횟수를 기준으로 dic을 정렬한다.
  3. 정렬된 dic를 순회하면서 각 장르 별로 정렬을 한다.
    1. 장르 내에서는 많이 재생된 노래 순으로 그리고 재생횟수가 같다면 고유번호가 낮은 노래 순으로 정렬한다.
    2. 만약 장르 내 노래의 개수가 1개라면 1개의 곡을 수록한다.

풀이 코드

Python

def solution(genres, plays):
    answer = []
    dic = {}
    for i,(g,p) in enumerate(zip(genres, plays)):
        if g in dic:
            dic[g].append([p,i])
            dic[g][0] += p
        else:
            dic[g] = [p, [p,i]]
    dic = sorted(dic.items(), key=lambda item : item[1][0], reverse=True)
    print(dic)
    for d in dic:
        tmp = sorted(d[1][1:], key=lambda x:(-x[0],x[1]))
        if len(tmp) < 2:
            answer.append(tmp[0][1])
        else:
            answer.extend([tmp[0][1], tmp[1][1]])
    return answer

# print(solution(["classic", "pop", "classic", "classic", "pop"], [500, 600, 150, 800, 2500]))
print(solution(["classic", "pop", "classic", "classic", "pop", "test"], [500, 600, 150, 800, 2500, 100]))
# print(solution(["classic"], [300]))

댓글남기기