728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/42579?language=python3
최종 코드
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
반응형
'코테 노트 > 프로그래머스' 카테고리의 다른 글
Level 3 디스크 컨트롤러 Python 3 (0) | 2021.07.08 |
---|---|
Level 2 더 맵게 Python3 (0) | 2021.07.08 |
Level 2 위장 Python 3 (0) | 2021.07.08 |
Level 2 전화번호 목록 Python3 (0) | 2021.07.07 |
Level 1 완주하지 못한 선수 Python3 (0) | 2021.07.06 |