[programmers] 베스트앨범

KwonSC·2022년 3월 1일
0

programmers - Java

목록 보기
4/17
post-thumbnail

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


Code

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

Solution

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문 돌리면 되는것같아 나이브하게 해결했다.

0개의 댓글