[프로그래머스]level3-베스트앨범-Python[파이썬]

s2ul3·2022년 11월 15일
0
post-custom-banner

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/42579

문제설명

알고리즘

1. genres와 plays를 담을 dictionary 형태의 dict_gen 생성.

  • key : genres // value : (plays, 노래 고유번호)
  • 이때 노래 고유번호도 함께 저장해줘야 함!
    dict_gen = dict()
    i = -1
    for g, p in zip(genres, plays):
        i += 1
        dict_gen[g] = dict_gen.get(g, []) + [(p, i)]

--> dict_gen : {'classic': [(500, 0), (150, 2), (800, 3)], 'pop': [(600, 1), (2500, 4)]}

2. 각 key(genre)들을 value list의 plays값이 작은 순으로 정렬

  • 만일 plays값이 같다면 고유번호가 큰 순서로 정렬
    for k in dict_gen:
        dict_gen[k].sort(key = lambda x: (-x[0], x[1]))
    print(dict_gen)

--> {'classic': [(800, 3), (500, 0), (150, 2)], 'pop': [(2500, 4), (600, 1)]}

3. value들의 plays값의 합이 작은 순으로 key 정렬

  • 위 예시에서는 classic의 plays 합은 800 + 500 + 150 = 1450
    pop의 plays 합은 2500+600=3100이므로
    pop --> classic 순으로 정렬해야한다.
  • plays 합을 구해주는 함수 get_sum( )을 따로 만들어 줬다.
  • dict_gen.items()의 결과 값은 다음과 같다.
    dict_items([('classic', [(800, 3), (500, 0), (150, 2)]), ('pop', [(2500, 4), (600, 1)])])
    plays의 합을 구하려면 dict_gen.items()결과에서 0번째 값이 아닌 1번째 값 [(800, 3), (500, 0), (150, 2)]과[(2500, 4), (600, 1)])] 에서 구해야하므로 get_sum함수의 인자로 1번째 값을 보내줘야 한다. --> lambda x: get_sum(x[1])
  • get_sum()의 결과 값이 작은 순으로 key값을 정렬해준다.
def get_sum(lst):
    total = 0
    return sum(list(map(lambda x:x[0], lst)))
    
key_sort_dict = sorted(dict_gen.items(), key = lambda x: get_sum(x[1]), reverse = True)

--> 정렬 결과 : [('pop', [(2500, 4), (600, 1)]), ('classic', [(800, 3), (500, 0), (150, 2)])]
의도한 대로 pop -> classic 순으로 key값이 정렬 되었다.

4. 장르 별로 가장 많이 재생된 노래를 최대 두개 추출하는데

k[1][:2]
이때 노래의 고유번호를 출력해야한다. map(lambda x:x[1], k[1][:2])

코드

def get_sum(lst):
    total = 0
    return sum(list(map(lambda x:x[0], lst)))

def solution(genres, plays):
    dict_gen = dict()
    i = -1
    for g, p in zip(genres, plays):
        i += 1
        dict_gen[g] = dict_gen.get(g, []) + [(p, i)]
    
    print(dict_gen)
    print('---------------')
    for k in dict_gen:
        dict_gen[k].sort(key = lambda x: (-x[0], x[1]))
    print(dict_gen)
    print('---------------')
    key_sort_dict = sorted(dict_gen.items(), key = lambda x: get_sum(x[1]), reverse = True)
    answer = []
    for k in key_sort_dict:
        answer += list(map(lambda x:x[1], k[1][:2]))

    return answer
profile
statistics & computer science
post-custom-banner

0개의 댓글