티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/42579
1. 접근 방식
- 장르별 재생 수를 누적할 count 딕셔너리와 장르별 가장 많이 재생된 두 곡을 담을 songs 딕셔너리가 필요하다.
count 딕셔너리는 {"classic": 300, "pop": 1500} 모습이고, songs는 {"classic": [1, 3], "pop": [2, 0]} 모습이다. 이때 songs의 value는 길이가 최대 2인 리스트이다.
- 고유번호 i의 재생횟수가 담긴 plays 리스트를 key가 고유번호이고, value가 재생횟수인 딕셔너리로 바꾸고, 이를 재생횟수를 기준으로 정렬한다.
파이썬의 딕셔너리는 원래 순서가 없는 자료형이므로, 재생횟수를 기준으로 정렬하기 위해서는 OrderedDict을 사용해야 한다.
이렇게 생성된 딕셔너리는 (1) 고유 번호 순서대로 정렬된 상태인데, 이를 다시 재생 횟수를 기준으로 정렬하면 (2) 재생 횟수가 많은 순으로도 정렬된다. 즉, 기본적으로 재생 횟수가 높은 순으로 정렬되고, 만약 재생 횟수가 동일할 경우에는 고유 번호가 더 낮은 것의 순서가 먼저이다. 따라서 해당 딕셔너리를 순회하면, songs[장르]에 순서대로 노래의 고유 번호를 넣을 수 있어 편리하다.
2. 정답 코드
def solution(genres, plays):
from collections import OrderedDict
idx = OrderedDict(sorted({i: p for i, p in enumerate(plays)}.items(), key=lambda x: x[1], reverse=True))
count = {g: 0 for g in set(genres)}
songs = {g: [] for g in set(genres)}
for key, value in idx.items():
count[genres[key]] += value
if len(songs[genres[key]]) < 2:
songs[genres[key]].append(key)
answer = []
order = OrderedDict(sorted(count.items(), key=lambda x: x[1], reverse=True))
for key in order.keys():
answer.extend(songs[key])
return answer
728x90
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] H-index 파이썬 풀이 (0) | 2024.02.03 |
---|---|
[프로그래머스] [3차] 압축 파이썬 풀이 (0) | 2023.06.27 |
[프로그래머스] [1차] 셔틀버스 파이썬 정답 코드 (0) | 2023.06.23 |
[프로그래머스] k진수에서 소수 개수 구하기 파이썬 정답 코드 (0) | 2023.06.20 |
[프로그래머스] 바탕화면 정리 파이썬 정답 코드 (0) | 2023.06.19 |