본문 바로가기
Coding Test/Programmers

[프로그래머스] 베스트앨범 [JAVA(자바)]

‘프로그래머스 코딩테스트 고득점 Kit’ 문제 입니다. 😀

문제 👉 <코딩테스트 연습 - 베스트앨범 | 프로그래머스>

1. 문제

  1. genres는 노래의 장르를 나타내는 문자열을 plays는 노래별 재생 횟수를 나타낸다.
  2. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  3. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  4. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
  5. 모든 장르의 재생 횟수는 다르고, 장르에 속한 곡이 하나라면, 하나의 곡만 수록한다.

2. 풀이

해시 를 이용한 문제 풀이

  1. key는 장르를 value는 총 재생 횟수를 나타내는 Hash를 생성한다.
  2. key는 장르를 value는 {고유번호, 재생횟수}를 나타낼 수 있는 Hash를 생성한다.
    1. 재생횟수 내림차순
    2. 고유번호 오름차순
  3. 장르별 총 재생 횟수를 내림차순으로 정렬 후 총 재생 횟수가 높은 장르의 고유 번호를 리턴 배열에 추가한다.

3. 코드

import java.util.*;
class Solution {
    public int[] solution(String[] genres, int[] plays) {       
        Map<String, Integer> hmGenres = new HashMap<>();
        Map<String, PriorityQueue<int []>> hmPlays = new HashMap<>(); // {고유번호, 재생 횟수}

        for(int i=0; i<genres.length; i++){
            hmGenres.put(genres[i], hmGenres.getOrDefault(genres[i], 0) + plays[i]);
            // 재생 횟수 내림차순, 고유번호 오름차순
            hmPlays.computeIfAbsent(genres[i], k ->
                                   new PriorityQueue<>((o1, o2) -> o1[1] != o2[1] ? Integer.compare(o2[1], o1[1]) : Integer.compare(o1[0], o2[0]))
                                   ).add(new int[]{i, plays[i]});
        }

        // Map의 Value를 정렬하기 위해 List로 변환
        List<Map.Entry<String, Integer>> list = new ArrayList<>(hmGenres.entrySet());
        // 장르별 재생 횟수의 총합을 내림차순
        Collections.sort(list, (o1, o2) -> Integer.compare(o2.getValue(), o1.getValue()));

        List<Integer> answer = new ArrayList<>();
        for(Map.Entry<String, Integer> entry : list){
            int cnt = 0;
            PriorityQueue<int[]> que = hmPlays.get(entry.getKey());

            while(!que.isEmpty() && cnt < 2){
                ans.add(que.poll()[0]);
                cnt++;
            }
        }

        // List -> int[]
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}


References


🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋

댓글