본문 바로가기
프로그래머스/코딩테스트 고득점 kit

프로그래머스 해시 LV3 - 베스트앨범

by 맴썰 2025. 10. 13.

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

주어진 기준에 따라 주어진 노래를 정렬해 index를 출력하는 문제이다.

먼저 가장 많이 재생된 기준으로 내림차순 정렬된 String List를 만들었고, 이 List 원소별 HashMap<String, List>로 (재생횟수, index)를 저장한 뒤 Math.min(2,List.size())개씩 배열에 넣었다.

 

import java.util.*;
import java.util.stream.*;
class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        List<Integer> ans = new ArrayList<>();
        HashMap<String,Integer> playSum = new HashMap<>();//장르별 총 재생횟수
        for(int i = 0; i<plays.length; i++){
            playSum.put(genres[i],playSum.getOrDefault(genres[i],0) + plays[i]);
        }
        List<String> playOrder = playSum.keySet().stream().sorted((x1,x2) -> playSum.get(x2)-playSum.get(x1)).collect(Collectors.toList());
        HashMap<String,List<Temp>> idxTemp = new HashMap<>();
        for(int i = 0; i<playOrder.size(); i++){
            idxTemp.put(playOrder.get(i), new ArrayList<>());
        }
        for(int i = 0; i<plays.length; i++){
            idxTemp.get(genres[i]).add(new Temp(plays[i],i));
        }
        for(int i = 0; i<playOrder.size(); i++){
            String temp = playOrder.get(i);
            List<Temp> t = idxTemp.get(temp);
            Collections.sort(t);
            for(int j = 0; j<Math.min(2,t.size()); j++){
                ans.add(t.get(j).idx);
            }
        }
        return ans.stream().mapToInt(Integer::intValue).toArray();
    }
}
class Temp implements Comparable<Temp>{
    int plays;
    int idx;
    Temp(int p, int i){
        this.plays = p;
        this.idx = i;
    }
    @Override
    public int compareTo(Temp o){
        if(this.plays==o.plays) return this.idx - o.idx;
        else return o.plays-this.plays;
    }
}