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 값이 양수일 경우 위치를 바꾸고, 음수일 경우 그대로 간다는 것을 기억하자.