문제링크 => 베스트앨범
풀이.
1. unsortedGenreMap : 장르별 합계를 위해 HashMap<장르, 총재생수> 를 선언함.
2. reverseSortedGenreMap : 1의 HashMap을 value값인 총재생수의 내림차순으로 정렬함.
3. reverseSortedGenreMap을 순회
(1) unsortedPlayMap : HashMap<노래 고유번호, 노래 재생수> 를 선언함
(2) reverseSortedPlayMap : (1)의 HashMap을 value값인 노래 재생수의 내림차순으로 정렬함.
(3) reverseSortedPlayMap 중 2개씩만 정답 배열에 삽입
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
List<Integer> answer = new ArrayList<>();
// 1
HashMap<String, Integer> unsortedGenreMap = new HashMap<>();
LinkedHashMap<String, Integer> reverseSortedGenreMap = new LinkedHashMap<>();
for(int i=0; i<plays.length; i++){
unsortedGenreMap.put(genres[i], unsortedGenreMap.getOrDefault(genres[i], 0) + plays[i]);
}
// 2
unsortedGenreMap.entrySet()
.stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.forEachOrdered(i -> reverseSortedGenreMap.put(i.getKey(), i.getValue()));
// 3
Iterator<String> iter = reverseSortedGenreMap.keySet().iterator();
while(iter.hasNext()){
// (1)
String key = iter.next();
HashMap<Integer, Integer> unsortedPlayMap = new HashMap<>();
for(int i=0; i<genres.length; i++){
if(genres[i].equals(key)) unsortedPlayMap.put(i ,plays[i]);
}
// (2)
LinkedHashMap<Integer, Integer> reverseSortedPlayMap = new LinkedHashMap<>();
unsortedPlayMap.entrySet()
.stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.forEachOrdered(i->reverseSortedPlayMap.put(i.getKey(), i.getValue()));
// (3)
Iterator<Integer> subIter = reverseSortedPlayMap.keySet().iterator();
int cnt = 2;
while(subIter.hasNext() && cnt > 0){
cnt -= 1;
Integer idx = subIter.next();
answer.add(idx);
}
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
'CS > Algorithm' 카테고리의 다른 글
[Programmers/Java] 자연수 뒤집어 배열로 만들기 (0) | 2022.11.04 |
---|