우파루파의 개발 기록

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

development/알고리즘

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

upa-r-upa 2024. 10. 24. 15:20

안녕하세요.

이번 문제는 프로그래머스의 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분 정도 썼습니다. 쉬운 개념인데도 불구하고 빠르게 푸는게 잘 안됩니다.

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