용꿀
꼬마개발자허니
용꿀
전체 방문자
오늘
어제
  • 분류 전체보기 (250)
    • 개발 (77)
      • 스프링 입문 (7)
      • 스프링 기본 (9)
      • ToDo List using JPA (2)
      • 스프링 개념 (9)
      • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (8)
      • 스프링 MVC (3)
      • CS (21)
      • 개발 팁 (8)
      • 스프링 MSA (5)
      • 곰터뷰🐻 (5)
    • 알고리즘 (169)
      • 알고리즘 문제 풀이 (165)
    • 잡동사니 (1)
      • 노래 가사 (1)
hELLO · Designed By 정상우.
용꿀

꼬마개발자허니

[프로그래머스 Lv.3] 베스트앨범 (Python)
알고리즘/알고리즘 문제 풀이

[프로그래머스 Lv.3] 베스트앨범 (Python)

2024. 7. 7. 13:05

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42579

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

장르별 플레이 누적 합을 담고 있는 딕셔너리와 장르별 음악 각각의 플레이 수를 담고 있는 딕셔너리 2개를 활용하여 문제를 풀이하면 쉽게 풀이할 수 있다. 레벨 3 문제치고 어렵지 않은 문제라고 생각한다.

from collections import defaultdict
from functools import cmp_to_key

def cmp(x, y): # 비교 함수
    if x[1] == y[1]: # 노래의 플레이 수가 같으면
        return x[0] - y[0] # 작은 번호가 먼저 나오도록
    return y[1] - x[1] # 플레이 수가 큰 것이 먼저 나오도록
    
def solution(genres, plays):
    play_cnt = defaultdict(int) # 장르별 플레이 누적 합을 담고 있는 딕셔너리
    musics = defaultdict(list) # 장르별 음악 각각의 플레이 수를 담고 있는 딕셔너리
    
    for i in range(len(genres)):
        genre = genres[i] # i번째 음악의 장르
        play = plays[i] # i번째 음악의 플레이 수
        
        play_cnt[genre] += play # 장르별 플레이 수를 누적
        musics[genre].append((i, play)) # 장르별 음악 각각의 플레이 수 저장
    
    for music_list in musics.values(): # 장르별 음악 각각을 순회하며
        music_list.sort(key=cmp_to_key(cmp)) # 플레이 수의 내림차순으로, 플레이 수가 같다면 번호의 오름차순으로 정렬
    
    answer = []
    for item in sorted(play_cnt.items(), key=lambda x: x[1], reverse=True): # 누적 플레이 수의 내림차순으로 장르를 정렬
        genre, _ = item
        song_ranks = musics[genre] # 장르별 음악 각각의 순위
        if len(musics[genre]) == 1: # 장르별 음악이 단 하나만 존재한다면
            answer.append(song_ranks[0][0]) # 그 음악의 번호를 저장
        else: # 하나 이상이라면
            answer.append(song_ranks[0][0]) # 가장 플레이 수가 높은 것 저장
            answer.append(song_ranks[1][0]) # 그 다음으로 플레이 수가 높은 것 저장
    return answer

'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글

[프로그래머스 Lv.3] N으로 표현 (Python)  (0) 2024.07.07
[프로그래머스 Lv.2] 피보나치 수 (Python)  (0) 2024.07.07
[프로그래머스 Lv.2] 오픈채팅방 (Python)  (0) 2024.07.06
[프로그래머스 Lv.3] 징검다리 건너기 (Python)  (0) 2024.07.03
[프로그래머스 Lv.4] N으로 표현 (Python)  (0) 2024.07.02
    '알고리즘/알고리즘 문제 풀이' 카테고리의 다른 글
    • [프로그래머스 Lv.3] N으로 표현 (Python)
    • [프로그래머스 Lv.2] 피보나치 수 (Python)
    • [프로그래머스 Lv.2] 오픈채팅방 (Python)
    • [프로그래머스 Lv.3] 징검다리 건너기 (Python)
    용꿀
    용꿀

    티스토리툴바