https://school.programmers.co.kr/learn/courses/30/lessons/42579
설명
처음에는 하나의 map만 사용해서 정렬을 하려고 했으나, HashMap을 두개 생성해서 장르 별 플레이된 횟수를 저장하는 방식을 택했다.
Map<String, Map<Integer, Integer>> map = new HashMap<>(); // 장르별로 음악 정보(고유 번호: 플레이횟수) 저장
Map<String, Integer> genre = new HashMap<>(); // 장르별 플레이 횟수 저장
for(int i = 0; i < genres.length; i++) {
Map<Integer, Integer> getMap = (HashMap) map.getOrDefault(genres[i], new HashMap<>());
getMap.put(i, plays[i]);
map.put(genres[i], getMap); // 장르별 음악 정보 map에 장르에 따른 음악 정보를 저장한다.
genre.put(genres[i], genre.getOrDefault(genres[i], 0) + plays[i]); // 장르별 플레이 횟수를 저장한다.
}
// 장르별 플레이 횟수를 기준으로 정렬한다.
List<String> keySet = new ArrayList<>(genre.keySet());
keySet.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return genre.get(o2) - genre.get(o1); // 내림차순 정렬
}
});
// 장르별 플레이 횟수를 기준으로 정렬된 값을 가지고, 각 장르의 음악들을 정렬하고, 2개까지 저장한다.
for(String key : keySet) {
Map<Integer, Integer> musics = (HashMap) map.get(key);
List<Integer> musicKey = new ArrayList<>(musics.keySet());
musicKey.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return musics.get(o2) - musics.get(o1);
}
});
if(musicKey.size() == 1) {
answer.add(musicKey.get(0));
}
else {
for(int i = 0; i < 2; i++) {
answer.add(musicKey.get(i));
}
}
}
코드
import java.util.*;
class Solution {
public List<Integer> solution(String[] genres, int[] plays) {
List<Integer> answer = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
Map<String, Integer> genre = new HashMap<>();
for(int i = 0; i < genres.length; i++) {
Map<Integer, Integer> getMap = (HashMap) map.getOrDefault(genres[i], new HashMap<>());
getMap.put(i, plays[i]);
map.put(genres[i], getMap);
genre.put(genres[i], genre.getOrDefault(genres[i], 0) + plays[i]);
}
List<String> keySet = new ArrayList<>(genre.keySet());
keySet.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return genre.get(o2) - genre.get(o1);
}
});
for(String key : keySet) {
Map<Integer, Integer> musics = (HashMap) map.get(key);
List<Integer> musicKey = new ArrayList<>(musics.keySet());
musicKey.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return musics.get(o2) - musics.get(o1);
}
});
if(musicKey.size() == 1) {
answer.add(musicKey.get(0));
}
else {
for(int i = 0; i < 2; i++) {
answer.add(musicKey.get(i));
}
}
}
return answer;
}
}