42579 | 베스트앨범
Level 3
https://programmers.co.kr/learn/courses/30/lessons/42579


작성 코드
from collections import defaultdict
def solution(genres, plays):
answer = []
genre_play = defaultdict(list)
genre_play_sum = defaultdict(int)
for idx, genre in enumerate(genres):
genre_play[genre].append([idx, plays[idx]])
genre_play_sum[genre] += plays[idx]
sorted_genre_play_sum = sorted(genre_play_sum.items(), key = lambda x: x[1], reverse=True)
for genre in genre_play:
genre_play[genre] = sorted(genre_play[genre], key = lambda x: x[1], reverse=True)
for genre in sorted_genre_play_sum:
answer.append(genre_play[genre[0]][0][0])
if len(genre_play[genre[0]]) >= 2:
answer.append(genre_play[genre[0]][1][0])
return answer
- genre_play - list 형 defaultdict, genre를 key 값으로 [고유번호, 재생 횟수] 를 value 값으로
- genre_play_sum - int 형 defaultdict, genre를 key 값으로 합을 value로
- genre_play - value[1] (재생 횟수) 값으로 정렬
- genre_play_sum - value 값으로 정렬
- 장르 내 인기 많은 곡 최대 두 곡까지 수록할 수 있음 -> 첫 번째 곡은 무조건 수록, 길이가 2 이상이라면 두 번째 곡도 수록
이상 코드
def solution(genres, plays):
answer = []
dic1 = {}
dic2 = {}
for i, (g, p) in enumerate(zip(genres, plays)):
if g not in dic1:
dic1[g] = [(i, p)]
else:
dic1[g].append((i, p))
if g not in dic2:
dic2[g] = p
else:
dic2[g] += p
for (k, v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True):
print(k, v)
for (i, p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]:
answer.append(i)
return answer
- 생각보다 본인이 작정한 코드와 큰 차이는 없음
- 코드가 간결해짐
- list 길이가 slicing 할 길이보다 적어도 오류는 안 뜸
학습
- 배열끼리 값을 묶어서 계산할 때 index 기준으로 하기 보다는 zip 사용하는 것이 가독성 좋음
- list slicing 할 때 그냥 [:2] 해줘도 됨
a = [1]
print(a[:2])
- min(len(dict1[k]), 2) 해줘도 되지만 코드가 길어짐
반응형
'Algorithm > programmers' 카테고리의 다른 글
| [프로그래머스] 43165 | 타겟 넘버 (0) | 2022.02.15 |
|---|---|
| [프로그래머스] 62048 | 멀쩡한 사각형 (0) | 2022.02.08 |
| [프로그래머스] 42578 | 위장 (0) | 2022.01.17 |
| [프로그래머스] 68935 | 3진법 뒤집기 (0) | 2022.01.11 |
| [프로그래머스] 42577 | 전화번호 목록 (0) | 2022.01.07 |
댓글