본문 바로가기
알고리즘 스터디

[Programmers][Python][해시] 베스트앨범 - level3

by Dblog 2021. 2. 5.
728x90

programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

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

programmers.co.kr

 

정답코드
def solution(genres, plays):
    answer = []    
    music_dict = {}
    category = []
    
#   set category dict
    for i in range(len(genres)):
        if genres[i] in music_dict.keys():
            music_dict[genres[i]].append((plays[i],i))
        else:
            music_dict[genres[i]] = []
            music_dict[genres[i]].append((plays[i],i))
    
#   classify category    
    for i in music_dict.keys():
        category.append((i, sum(map( lambda x: x[0], music_dict[i])) ))

        
        
    category.sort(key = lambda x : x[1], reverse = True)
    
    for i in category:
        lists = music_dict[i[0]]
        lists.sort(key = lambda x : x[0], reverse = True)
        for i in range(2):
            try:
                answer.append(lists[i][1])
            except:
                pass
    
    
    return answer

 

간단설명

dictonary를 이용해서 먼저 음악의 카테고리를 나눴습니다. 첫번째 반복문이 끝나면 music_dict변수에 

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

이와 같이 데이터가 담기게 됩니다. 

이제 이 데이터의 값을 더해서 우선순위를 고르고 우선순위를 순회 하면서 list의 높은 값부터 가지고 오게 됩니다.

pop : [(2500, 4), (600, 1)]
classic : [(800, 3), (500, 0), (150, 2)]

출력된 결과 리스트에서 앞 두개씩만 가져옵니다.

728x90

댓글