본문 바로가기
development/알고리즘

[프로그래머스] 42579: 베스트앨범

by upa-r-upa 2024. 10. 24.

안녕하세요.

이번 문제는 프로그래머스의 3단계 문제 '베스트앨범' 입니다.

해시 기반 문제라고 분류가 되어 있네요. 개념이 어려운 문제는 아니었습니다. 

 

이제부턴 문제 사진을 추가하진 않으려고 합니다. 링크로 대체합니다.

https://school.programmers.co.kr/learn/courses/30/lessons/42579

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

이번 문제는 조건만 잘 따지면 됩니다.

 

문제 핵심

- 장르별로 가장 많이 재생된 노래를 '모든 종류별로' 노래를'두개(장르에 노래가 한곡만 있을 수 있음)'씩 모아야 함
- 노래는 '고유번호'로 구분, 노래는 (genres[i] = plays[i])
- 수록 기준 우선순위
   # 1. 많이 재생된 '장르' 우선. (전체 노래를 종합 했을때)
   # 2. 그 장르 내에선 '많이 재생된 노래' 우선.
   # 3. 재생 횟수가 같다면, '고유 번호가 낮은' 노래를 먼저 수록

 

-> 베스트 앨범에 들어갈 노래의 '고유 번호'를 순서대로.

 

문제 아이디어

1.  for문(두가지 배열 동시에)을 돌아 dict를 통해 장르별 play 수를 저장

  -> 해당 순회 중 새로운 배열을 return [장르, 플레이 수, 고유번호]
2. 해당 배열을 장르 수 내림차순, 플레이 수 내림차순, 고유 번호 오름차순으로 정렬

3. 그리고 정렬한 배열을 다시 for문을 돌아 2개씩 새로운 배열에 저장.

 

최종 코드

def solution(genres, plays):
    plays_dict = dict()
    song_list = []
    
    for i in range(len(genres)):
        gen = genres[i]
        play = plays[i]
        
        if gen in plays_dict:
            plays_dict[gen] += play
        else:
            plays_dict[gen] = play
        
        song_list.append([gen, play, i])
    
    sorted_song_list = sorted(song_list, key=lambda song: (-plays_dict[song[0]], -song[1], song[2]))
    
    result = []
    cnt = 0
    
    for j in range(len(sorted_song_list)):
        is_first = j == 0
        
        if j != 0 and sorted_song_list[j-1][0] != sorted_song_list[j][0]:
            cnt = 1
            result.append(sorted_song_list[j][2])
        elif cnt < 2:
            cnt += 1
            result.append(sorted_song_list[j][2])
    
    return result

테스트 케이스 (기본 제공 테스트케이스 제외)

입력 출력
["classic", "pop", "classic", "pop", "pop", "pop"]
["classic", "pop", "classic", "pop", "pop", "pop"]
[2, 0, 1, 5]
["classic", "pop", "classic", "pop", "pop", "pop", "classic", "jazz"]
[1000, 500, 1001, 100, 300, 400, 1002, 50000]
[7, 6, 2, 1, 5]

여담

이제 취업을 위해 코딩 테스트를 시간을 신경쓰면서 풀고 있는데 쉽지 않습니다. 과제 테스트로 하고싶어요..

이번 문제도 20-25분 정도 썼습니다. 쉬운 개념인데도 불구하고 빠르게 푸는게 잘 안됩니다.

역시 코딩 테스트는 어렵습니다..