목표 (문제)
- 같은 장르가 많은 노래 그룹을 먼저 수록합니다.
- 같은 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
조건
- genres[i]는 고유번호가 i인 노래의 장르입니다.
- plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
- genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
- 장르 종류는 100개 미만입니다.
- 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
- 모든 장르는 재생된 횟수가 다릅니다.
잡설
domain 구성하면 복잡하지 않게 해결될거같긴 한데 다른방법도 해보고 싶어서나름 구성해보았으나… 저 sort 메서드를 합칠 방법이 뭐가 있을까?
분명히 저렇게 중복되는걸 자료형 선택해서 하나의 메서드로 합쳐 처리하는 방법이 있을텐데
그걸 모르겠네
코드
import java.util.*;
import java.util.Map.Entry;
class Solution {
public int[] solution(String[] genres, int[] plays) {
HashMap<String, HashMap<Integer, Integer>> music = new HashMap<>();
HashMap<String, Integer> total = new HashMap<>();
for (int index = 0, maxIndex = plays.length; index < maxIndex; index++) {
HashMap<Integer, Integer> item;
if (music.containsKey(genres[index])) {
item = music.get(genres[index]);
total.put(genres[index], total.get(genres[index]) + plays[index]);
} else {
item = new HashMap<>();
total.put(genres[index], plays[index]);
}
item.put(index, plays[index]);
music.put(genres[index], item);
}
List<Integer> answer = new ArrayList<>();
for (String item : sortTotal(total).keySet()) {
Set<Integer> sortedMusic = sortMusic(music.get(item)).keySet();
int index = 0;
for (Integer item2 : sortedMusic) {
if (index++ > 1 ) {
break;
}
answer.add(item2);
}
}
return answer.stream().mapToInt(i->i).toArray();
}
public LinkedHashMap<String, Integer> sortTotal(HashMap<String, Integer> total) {
List<Entry<String, Integer>> list = new ArrayList<>(total.entrySet());
list.sort(Entry.comparingByValue(Comparator.reverseOrder()));
LinkedHashMap<String, Integer> sortedTotal = new LinkedHashMap<>();
for (Entry<String, Integer> entry : list) {
sortedTotal.put(entry.getKey(), entry.getValue());
}
return sortedTotal;
}
public LinkedHashMap<Integer, Integer> sortMusic(HashMap<Integer, Integer> music) {
List<Entry<Integer, Integer>> list = new ArrayList<>(music.entrySet());
list.sort(Entry.comparingByValue(Comparator.reverseOrder()));
LinkedHashMap<Integer, Integer> sortedMusic = new LinkedHashMap<>();
for (Entry<Integer, Integer> entry : list) {
sortedMusic.put(entry.getKey(), entry.getValue());
}
return sortedMusic;
}
}
0 개의 댓글:
댓글 쓰기