https://programmers.co.kr/learn/courses/30/lessons/42579
import java.util.*;
class Solution {
public static int[] solution(String[] genres, int[] plays) {
ArrayList<Integer> result = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
Map<String, ArrayList<ArrayList<Integer>>> index = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
if (map.containsKey(genres[i])) {
map.put(genres[i], plays[i] + map.get(genres[i]));
ArrayList<Integer> temp = new ArrayList<>(Arrays.asList(i, plays[i]));
ArrayList<ArrayList<Integer>> list = index.get(genres[i]);
list.add(temp);
index.put(genres[i], list);
}
else {
map.put(genres[i], plays[i]);
ArrayList<Integer> temp = new ArrayList<>(Arrays.asList(i, plays[i]));
ArrayList<ArrayList<Integer>> list = new ArrayList<>(Arrays.asList(temp));
index.put(genres[i], list);
}
}
List<Map.Entry<String, Integer>> entryList = new LinkedList<>(map.entrySet());
entryList.sort(((o1, o2) -> map.get(o2.getKey()) - map.get(o1.getKey())));
for (Map.Entry<String, Integer> entry : entryList) {
ArrayList<ArrayList<Integer>> list = index.get(entry.getKey());
Collections.sort(list, (arr1, arr2) -> arr2.get(1) - arr1.get(1));
for (int i = 0; i < list.size() && i < 2; i++) {
result.add(list.get(i).get(0));
}
}
int[] answer = new int[result.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = result.get(i);
}
return answer;
}
}
map
은 장르, 총 재생횟수
인 해시맵이고 index
는 장르, 해당 장르들의 [고유번호, 재생횟수] ArrayList
인 해시맵이다. ArrayList<Integer>
의 0번째 인덱스는 고유번호, 1번째 인덱스는 해당 곡의 재생 횟수이다. 처음에 전체 for문을 돌며 해시맵에 맞는 데이터를 삽입하고 map
을 내림차순 정렬후 map
을 돌며 index
를 뽑아 value기준으로 정렬후 2개를 result에 넣는다. 마지막에 result를 int 배열로 변환후 리턴.
Collections.sort()
를 몰라 오랜시간 헤맸다. Arrays.sort()
는 배열을 정렬하는것이고 Collections.sort()
는 객체를 정렬하는것이다. 나는 2차원 ArrayList를 정렬해야하니 안의 요소인 1차원 ArrayList, 즉 객체를 정렬해야하는데 Arrays.sort()
가 안돼 계속 찾아보았었다. 또한 result를 int 배열로 바꾸는 방법도 알아봤는데 그냥 for문 돌리면 되는것같아 나이브하게 해결했다.