본문 바로가기

Programmers/Level3

베스트앨범

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.util.*;
import java.util.Map.Entry;
class Solution {
    static class Music {
        String genre;
        int play;
        int idx;
 
        public Music(String genre, int play, int idx) {
            this.genre = genre;
            this.play = play;
            this.idx = idx;
        }
    }
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        HashMap<String, Integer> genresTotalPlay = new HashMap<String, Integer>();
 
        // 장르별 최종 재생 횟수 저장
        for (int i = 0; i < genres.length; i++) {
            genresTotalPlay.put(genres[i], genresTotalPlay.getOrDefault(genres[i], 0+ plays[i]);
        }
 
        // 장르 오름차순 정렬
        ArrayList<Entry<String, Integer>> sortedgenresTotalPlay = new ArrayList<Entry<String, Integer>>(
                genresTotalPlay.entrySet());
        Collections.sort(sortedgenresTotalPlay, new Comparator<Entry<String, Integer>>() {
            public int compare(Entry<String, Integer> obj1, Entry<String, Integer> obj2) {
                return obj2.getValue().compareTo(obj1.getValue());
            }
        });
        String[] topGenres = new String[sortedgenresTotalPlay.size()];
        for (int i = 0; i < topGenres.length; i++) {
            topGenres[i] = sortedgenresTotalPlay.get(i).getKey();
        }
 
        ArrayList<ArrayList<Music>> result = new ArrayList<ArrayList<Music>>();
        for (String genre : topGenres) {
            ArrayList<Music> list = new ArrayList<Music>();
            for (int i = 0; i < genres.length; i++) {
                if (genres[i].equals(genre)) {
                    list.add(new Music(genre, plays[i], i));
                }
            }
            // play 내림차순 정렬, 값이 같은 경우 고유번호가 낮은 순으로 정렬
            Collections.sort(list, new Comparator<Music>() {
                @Override
                public int compare(Music o1, Music o2) {
                    int a = o2.play - o1.play;
                    if (a == 0)
                        return o1.idx - o2.idx;
                    return a;
                }
            });
            result.add(list);
        }
 
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.size(); i++) {
            int cnt = 0;
            for (Music m : result.get(i)) {
                sb.append(m.idx + " ");
                cnt++;
                if (cnt > 1)
                    break;
            }
        }
        answer = Arrays.stream(sb.toString().trim().split(" ")).mapToInt(Integer::parseInt).toArray();
        return answer;
    }
}
cs

Hashmap과 Music 클래스를 Comparator 및 compare로 정렬하였다.

compare의 동작 방식에 대해서 조금은 잘 알게 되었다.

compare return 값이 양수일 경우 위치를 바꾸고, 음수일 경우 그대로 간다는 것을 기억하자.

'Programmers > Level3' 카테고리의 다른 글

불량 사용자  (0) 2021.08.16
최고의 집합  (0) 2021.08.13
110 옮기기  (0) 2021.08.12
2 x n 타일링  (0) 2021.08.12
순위  (0) 2021.08.12