문제 설명 url : https://programmers.co.kr/learn/courses/30/lessons/42579

문제 풀이 (주석 확인) :

import java.util.*;

class BestAlbum {
    public int[] solution(String[] genres, int[] plays) {
        HashMap<String, Integer> hm = new HashMap<String, Integer>();
        //hm : 각 장르별 전체 플레이수를 비교하기 위함
        HashMap<Integer, String> genresMap = new HashMap<Integer, String>();
        HashMap<Integer, Integer> playMap = new HashMap<Integer, Integer>();
        //장르별 플레이 횟수, ex) pop : 600+2500 = 3100, classic : 500+150+800 = 1450
        for (int i = 0; i < genres.length; i++) {
            if (hm.containsKey(genres[i])) { // 같은 장르가 있으면 +
                hm.put(genres[i], hm.get(genres[i]) + plays[i]);
            } else { // 새로운 장르
                hm.put(genres[i], plays[i]);
                //System.out.println("put : " + hm.get(genres[i]));
            }
        }
        for (int i = 0; i < genres.length; i++) { // 장르와 플레이수를 각각 다른 해쉬맵(genresMap, playMap)에 저장
            genresMap.put(i, genres[i]);
            playMap.put(i, plays[i]);
        }
        //정렬, hashmap key를 정렬할 땐 TreeSet을 이용하면 쉽게 정렬이 가능함
        //value로 정렬해주는 컬렉션은 존재하지 않아서 Comparator 인터페이스를 이용하여 정렬
        Iterator it = sortByValue(hm).iterator();
        ArrayList<String> genresIndexAl = new ArrayList<String>();
        while (it.hasNext()) {
            String temp = (String) it.next();
            //System.out.println(temp + " = " + hm.get(temp));
            genresIndexAl.add(temp);//genresIndexAl 0번째요소 : pop = 3100, 1번째요소 : classic = 1450
        }

        //장르별 많이 플레이 된 노래의 고유번호 찾기
        ArrayList<Integer> fIndex = new ArrayList<Integer>();
        for(int i = 0; i<genresIndexAl.size(); i++){ // 각 장르 별로 for, 예제는 pop, classic으로 총 2번 진행됨
            int idx = 0;
            //각 장르(pop, classic)가 총 몇개인지 셈
            for(int p1 : genresMap.keySet()){
                if(genresIndexAl.get(i).equals(genresMap.get(p1))){
                    idx++;
                }
            }
            //장르 개수만큼 임시 배열 생성하고, plays 넣음
            int[] temp = new int[idx];
            int k = 0;
            for(int p2 : genresMap.keySet()){
                if(genresIndexAl.get(i).equals(genresMap.get(p2))){
                    temp[k] = playMap.get(p2);
                    k++;
                }
            }
            System.out.println(temp.length);
            for (int q = 0; q< temp.length;q++){
                System.out.println("temp ["+q+"] : "+ temp[q]);
            }

            //플레이수 정렬
            if(temp.length != 1){
                Arrays.sort(temp); // 내림차순
                for(int j = temp.length - 1; j >= temp.length - 2; j--){ //뒤부터 순회, 큰값부터
                    for(int p : playMap.keySet()){ // 인덱스 찾기
                        if(temp[j] == playMap.get(p)){
                            fIndex.add(p);
                            playMap.put(p, 0);
                            break;
                        }
                    }
                }
            }else{ // genres[]에 장르 종류가 1, 정렬필요x, temp순회x
                for(int p : playMap.keySet()){
                    if(temp[0] == playMap.get(p)){
                        fIndex.add(p);
                        playMap.put(p, 0);
                        break;
                    }
                }
            }
        }
        for(int a : playMap.keySet()){
            System.out.println("playMap : "+ playMap.get(a));
        }
        int[] answer = new int[fIndex.size()];
        //ArrayList -> Array
        for(int i = 0; i < fIndex.size(); i++){
            answer[i] = fIndex.get(i);
        }

        return answer;
    }

    public static List sortByValue(final Map map) {
        ArrayList<String> list = new ArrayList();
        list.addAll(map.keySet());
        Collections.sort(list, new Comparator() {
            public int compare(Object o1, Object o2) {
                Object v1 = map.get(o1);
                Object v2 = map.get(o2);
                return ((Comparable) v1).compareTo(v2);
            }
        });
        Collections.reverse(list);
        return list;
    }
}