코테 노트/프로그래머스

Level 3 베스트 앨범 Python3

화요밍 2021. 7. 8. 01:26
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/42579?language=python3 

 

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

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

programmers.co.kr

 

최종 코드

 

hwayeon351/Programmers-Algorithms

프로그래머스 알고리즘 소스 코드 모음. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

from collections import defaultdict, Counter
def solution(genres, plays):
    answer = []
    genres_plays_dict = defaultdict(list)
    num_play_genres = Counter()
    
    for i in range(len(genres)):
        genres_plays_dict[genres[i]].append([plays[i], i])
        num_play_genres[genres[i]] += plays[i]
        
    for key, val in list(genres_plays_dict.items()):
        genres_plays_dict[key] = sorted(val, key = lambda x:(-x[0],x[1]))
        
    for g, n in num_play_genres.most_common():
        song = genres_plays_dict[g]
        if len(song) == 1:
            answer.append(song[0][1])
            continue
        for j in range(2):
            answer.append(song[j][1])
    return answer

풀이 과정

풀이 시간 1시간 9분

from collections import defaultdict, Counter
def solution(genres, plays):
    answer = []
    # 장르별 재생된 노래를 표현하는 딕셔너리
    # 장르 = key, 노래와 재생 횟수를 각각 담은 리스트 = value 
    genres_plays_dict = defaultdict(list)
    # 장르별 총 재생 횟수를 표현하는 카운터
    num_play_genres = Counter()
    
    #딕셔너리 초기화
    for i in range(len(genres)):
    	#[재생 횟수, 노래의 고유 번호]형태로 딕셔너리에 추가
        genres_plays_dict[genres[i]].append([plays[i], i])
        # 장르의 재생 횟수 카운팅
        num_play_genres[genres[i]] += plays[i]
    
    #장르별 재생된 노래는 재생이 많이 된 순서대로 내림차순 정렬하고 노래의 고유 번호는 오름차순으로 정렬
    for key, val in list(genres_plays_dict.items()):
        genres_plays_dict[key] = sorted(val, key = lambda x:(-x[0],x[1]))
   	
    #num_play_genres 카운터에 most_common()을 통해 총 재생 횟수가 큰 장르 순서대로 표현한 리스트를 반환
    for g, n in num_play_genres.most_common():
    	#genres_plays_dict에서 장르별로 많이 재생된 순서대로 2곡 answer에 추가
        song = genres_plays_dict[g]
        #해당 장르에 속한 노래가 1개인 경우, 하나의 곡만 선택
        if len(song) == 1:
            answer.append(song[0][1])
            continue
        #해당 장르에서 재생 횟수가 큰 노래와 2번째로 큰 노래를 선택하여 answer에 추가
        for j in range(2):
            answer.append(song[j][1])
    return answer
    #시간복잡도 = O(nlogn) 공간복잡도 = O(n)
728x90
반응형