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;
}
}