문제/프로그래머스

[프로그래머스] 베스트앨범 - Java

icodesiuuuu 2024. 11. 1. 13:01

문제

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

 

프로그래머스

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

programmers.co.kr

 


 

문제 설명

스트리밍 사이트에서 장르별로 가장 많이 재생된 노래를 최대 두 개씩 모아 베스트 앨범을 출시하려 합니다. 각 노래는 고유 번호로 구분되며, 앨범에 수록할 노래를 선택하는 기준은 다음과 같습니다.

  1. 장르별 총 재생 횟수가 많은 순으로 노래를 수록합니다.
  2. 같은 장르 내에서는 재생 횟수가 많은 노래를 우선 수록합니다.
  3. 재생 횟수가 같은 노래가 있을 경우, 고유 번호가 낮은 노래를 우선 수록합니다.

이때, 주어진 genres 배열과 plays 배열을 통해 베스트 앨범에 수록될 노래의 고유 번호 목록을 반환하는 solution 함수를 완성해야 합니다.

 

접근 방법

  1. 장르별 재생 횟수 합산:
    • 각 장르의 총 재생 횟수를 계산하여, 재생 횟수에 따라 장르의 우선순위를 결정합니다.
  2. 장르 내에서 노래 선택:
    • 장르별로 재생 횟수가 많은 노래를 최대 두 개까지 선택합니다.
    • 재생 횟수가 같을 경우, 고유 번호가 낮은 순으로 정렬하여 우선적으로 수록합니다.
  3. 정렬 및 결과 수집:
    • 장르별 총 재생 횟수를 기준으로 장르 목록을 내림차순 정렬합니다.
    • 각 장르별로 정렬된 노래 목록에서 최대 두 개의 노래를 수집하여 최종적으로 앨범에 수록될 노래의 고유 번호를 정리합니다.

해결 과정

  1. 장르별로 총 재생 횟수를 HashMap에 저장하여, 각 장르의 우선순위를 확인합니다. (HashMap)
  2. 장르 목록을 총 재생 횟수를 기준으로 내림차순 정렬합니다.
  3. 각 장르별로 반복하여 해당 장르에 속한 노래를 재생 횟수 기준으로 정렬하여 상위 두 곡을 선택합니다.
  4. 선택된 노래의 고유 번호를 최종 리스트에 추가하고 반환합니다.

 

import java.util.*;
class Solution {
    public int[] solution(String[] genres, int[] plays) {        
        HashMap<String, Integer> map = new HashMap<>();  // 장르별 총 재생 횟수 저장
        
        // 장르별 재생 횟수 합산
        for(int i = 0; i < genres.length; i++) {
            map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
        }
        
        List<Integer> list = new ArrayList<>();
        List<String> mapList = new ArrayList<>(map.keySet());
        
        // 장르별 총 재생 횟수에 따라 내림차순 정렬
        Collections.sort(mapList, (o1, o2) -> map.get(o2) - map.get(o1));
        
        for(String key : mapList) {
            for(int i = 0; i < 2; i++) {  // 각 장르별 최대 2곡 선택
                int idx = -1;
                int max = -1;
                for(int j = 0; j < genres.length; j++) {
                    if(genres[j].equals(key)) {  // 현재 장르에 해당하는 노래 찾기
                        if(max < plays[j]) {  // 가장 많이 재생된 노래 찾기
                            max = plays[j];
                            idx = j;
                        }
                    }
                }
                if(idx >= 0) {  // 선택된 노래 추가
                    list.add(idx);
                    plays[idx] = -1;  // 이미 선택한 노래는 제외
                }
            }
        }
        
        // 결과 배열 생성
        int[] answer = new int[list.size()];
        for(int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}