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

조예빈·2024년 10월 1일
0

Coding Test

목록 보기
143/146
post-custom-banner

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

HashMap 안에 ArrayList를 만드는 것 까지는 괜찮았지만, HashMap을 value값을 기준으로 정렬 하는 것이 어려웠다.

우선, Key에 해당하는 값을 가져와서 ArrayList에 담아야 한다. index에 key값을 저장하고, 각 방에 해당하는 값에 value를 저장하는 것이다.

import java.util.*;

class Solution {
    public ArrayList solution(String[] genres, int[] plays) {
        //속한 노래가 많이 재생된 장르 -> 장르 내에서 재생된 노래 -> 재생 횟수가 같으면 고유 번호가 낮은 노래
        int len = genres.length;
        HashMap<String, Integer> cntMap = new HashMap<>(); //전체 재생 횟수를 구하기 위함
        HashMap<String, ArrayList<int[]>> map = new HashMap<>(); //장르, <재생횟수, 고유번호> 
        ArrayList<Integer> answer = new ArrayList<>();
        
        for(int i=0; i<len; i++){ 
            if(cntMap.containsKey(genres[i])){
                cntMap.put(genres[i], cntMap.get(genres[i])+plays[i]);
            }else{
                cntMap.put(genres[i], plays[i]);
            }
        }
        
        for (int i=0; i<len; i++) {
            if (!map.containsKey(genres[i])) { //키가 없으면
                map.put(genres[i], new ArrayList<int[]>()); //빈 배열 생성 -> 이 과정을 안해주면 NullPointerException 발생
            }
            map.get(genres[i]).add(new int[]{plays[i], i}); //재생 횟수, 고유 번호 저장
        }
        
        //cntMap을 value값을 기준으로 정렬
        ArrayList<String> list = new ArrayList<>(cntMap.keySet());
        Collections.sort(list, new Comparator<String>(){
            @Override
            public int compare(String o1, String o2){
                return cntMap.get(o2) - cntMap.get(o1); //내림차순 정렬
            }
        });
        
        for(int i=0; i<list.size(); i++){
            ArrayList<int[]> songs = map.get(list.get(i));
            Collections.sort(songs, new Comparator<int[]>(){
                @Override
                public int compare(int[] o1, int[] o2){
                    if(o1[0] == o2[0]){
                        return o1[1] - o2[1];
                    }
                    return o2[0] - o1[0];
                }
            });
            for(int j=0; j<songs.size(); j++){
                if(j >= 2){
                    break;
                }
                answer.add(songs.get(j)[1]);
            }
        }

        return answer;
    }
}

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러
post-custom-banner

0개의 댓글