코테 노트/프로그래머스
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
반응형