반응형
딕셔너리 두 개를 사용해 문제를 풀어봤습니다.
- genre_score : 각 장르별 속한 노래의 총 점수를 저장하는 딕셔너리
- chk : 노래의 고유번호를 key 값으로 사용하고, value로 [해당 노래가 속한 장르의 점수, 해당 노래의 개별 점수]를 저장
이제 문제에 제시된 노래 수록 기준에 맞추어 정렬을 하고 추출을 하면 되겠습니다.
for문으로 두 딕셔너리의 값을 설정한 뒤 sorted를 이용해 딕셔너리를 정렬했습니다.
먼저 수록 기준 1번을 맞추기 위해 genre_score를 내림차순으로 정렬합니다.
그리고 2번과 3번 기준을 맞추기 위해 chk를 정렬하는데, sorted 안에서 람다식을 key=lambda x: (x[1], -x[0]), reverse=True 이렇게 설정하면 chk의 점수로 내림차순 정렬된 후 고유 번호로 오름차순 정렬됩니다. 이렇게 하면 2번 기준인 장르 내 많이 재생된 노래 순으로 1차적으로 정렬되고, 고유 번호 기준 오름차순 조건에 따라 같은 재생 횟수가 있는 경우 고유 번호가 낮은 노래가 앞으로 오게 됩니다.
마지막 for문을 돌며 순서대로 추출하면 되는데, 장르별 두 개씩 추출하라는 조건이 또 있었습니다. 해당 조건을 맞추기 위해 cnt 변수를 두어 각 장르별 추출된 횟수를 카운팅 하고, 안쪽 for문이 이미 탐색한 장르를 재탐색하는 일이 없도록 start 변수를 두어 안쪽 for문의 시작을 start 부터 진행되도록 코드를 작성했습니다!
문제 풀이(파이썬)
def solution(genres, plays):
genre_score = dict()
chk = dict()
for i in range(len(genres)):
genre_score[genres[i]] = genre_score.get(genres[i], 0) + plays[i]
for i in range(len(genres)):
chk[i] = [genre_score[genres[i]], plays[i]]
chk = sorted(chk.items(), key=lambda x: (x[1], -x[0]), reverse=True)
genre_score = sorted(genre_score.items(), key=lambda x:x[1], reverse=True)
start = 0
res = list()
for gs in genre_score:
cnt = 0
for i in range(start, len(chk)):
if chk[i][1][0] == gs[1] and cnt < 2:
start += 1
res.append(chk[i][0])
cnt += 1
return res
반응형
'Algorithm' 카테고리의 다른 글
[프로그래머스] 스택/큐 - 기능 개발(파이썬 문제풀이) (0) | 2022.03.12 |
---|---|
[프로그래머스] 완전탐색 - 모의고사(파이썬 문제풀이) (0) | 2021.04.02 |
[프로그래머스] 해시 - 완주하지 못한 선수(파이썬 문제풀이) (0) | 2021.03.31 |
[프로그래머스] DFS/BFS - 네트워크(파이썬 문제 풀이) (0) | 2021.03.18 |
[프로그래머스] DFS/BFS - 타겟 넘버(파이썬 문제 풀이) (0) | 2021.03.18 |
댓글