[프로그래머스] 베스트앨범
2022. 2. 7. 23:09ㆍPython/코딩 문제
# 문제 설명
장르 별로 가장 많이 재생된 노래를 2개씩 모아 베스트 앨범을 출시하려고 한다. 노래는 고유번호로 구분하며, 수록 기준은 다음과 같다.
- 장르 별로 속한 노래들의 재생 수가 많은 순으로 먼저 수록한다.
- 장르 내에서 많이 재생된 노래를 먼저 수록한다.
- 재생 횟수가 같다면, 고유 번호가 낮은 노래를 먼저 수록한다.
단, 장르에 속한 곡이 하나라면 한 곡만 선택하고,
모든 장르는 재생된 횟수가 다르다.
# 입출력 예시
입력 | 출력 |
genres = ["classic", "pop", "classic", "classic", "pop"] plays = [500, 600, 150, 800, 2500] |
[4, 1, 3, 0] |
# 코드 풀이
from collections import defaultdict
def solution(genres, plays):
answer = []
gcnt = defaultdict(int) # 장르별 재생수 합
gbyg = defaultdict(list) # 장르별 2개씩 {g:[(p,i),]}
for i, g, p in zip(range(len(plays)), genres, plays):
gcnt[g] += p
gbyg[g].append((p, i)) # 재생수, 고유번호
gcnt = sorted(gcnt.items(), reverse=True, key=lambda x: x[1]) # 내림차순
for g, _ in gcnt:
# 재생수 내림차순, 고유번호 오름차순
a, *rest = sorted(gbyg[g], reverse=True, key=lambda x: (x[0],-x[1]))
answer.append(a[1])
if rest:
answer.append(rest[0][1])
return answer
# 핵심 포인트
- 키 값에 따라 다르게 정렬해야 한다. 문제에서 재생 수는 많은 순서부터, 고유 번호는 낮은 순서부터 정렬해야 한다. 따라서 key매개변수로 역순은 -를 곱해준다.
- 인덱스가 고유번호에 해당하여, 다른 자료구조를 만들어서 정렬된 데이터를 저장한다.
반응형
'Python > 코딩 문제' 카테고리의 다른 글
[리트코드] 743. Network Delay Time (0) | 2022.02.14 |
---|---|
[프로그래머스] 가장 큰 수 (0) | 2022.02.07 |
[리트코드] 17. Letter Combinations of a Phone Number (0) | 2022.02.01 |
[리트코드] 46. Permutations (0) | 2022.02.01 |
[프로그래머스] 위장 (0) | 2022.02.01 |