https://school.programmers.co.kr/learn/courses/30/lessons/42579

주어진 기준에 따라 주어진 노래를 정렬해 index를 출력하는 문제이다.
먼저 가장 많이 재생된 기준으로 내림차순 정렬된 String List를 만들었고, 이 List 원소별 HashMap<String, List>로 (재생횟수, index)를 저장한 뒤 Math.min(2,List.size())개씩 배열에 넣었다.
import java.util.*;
import java.util.stream.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
List<Integer> ans = new ArrayList<>();
HashMap<String,Integer> playSum = new HashMap<>();//장르별 총 재생횟수
for(int i = 0; i<plays.length; i++){
playSum.put(genres[i],playSum.getOrDefault(genres[i],0) + plays[i]);
}
List<String> playOrder = playSum.keySet().stream().sorted((x1,x2) -> playSum.get(x2)-playSum.get(x1)).collect(Collectors.toList());
HashMap<String,List<Temp>> idxTemp = new HashMap<>();
for(int i = 0; i<playOrder.size(); i++){
idxTemp.put(playOrder.get(i), new ArrayList<>());
}
for(int i = 0; i<plays.length; i++){
idxTemp.get(genres[i]).add(new Temp(plays[i],i));
}
for(int i = 0; i<playOrder.size(); i++){
String temp = playOrder.get(i);
List<Temp> t = idxTemp.get(temp);
Collections.sort(t);
for(int j = 0; j<Math.min(2,t.size()); j++){
ans.add(t.get(j).idx);
}
}
return ans.stream().mapToInt(Integer::intValue).toArray();
}
}
class Temp implements Comparable<Temp>{
int plays;
int idx;
Temp(int p, int i){
this.plays = p;
this.idx = i;
}
@Override
public int compareTo(Temp o){
if(this.plays==o.plays) return this.idx - o.idx;
else return o.plays-this.plays;
}
}'프로그래머스 > 코딩테스트 고득점 kit' 카테고리의 다른 글
| 프로그래머스 깊이/너비 우선 탐색(DFS/BFS) LV2 - 게임 맵 최단거리 (0) | 2025.10.01 |
|---|---|
| 프로그래머스 깊이/너비 우선 탐색(DFS/BFS) LV3 - 단어변환 (0) | 2025.09.29 |
| 프로그래머스 깊이/너비 우선 탐색(DFS/BFS) LV3 - 네트워크 (0) | 2025.09.29 |
| 프로그래머스 깊이/너비 우선 탐색(DFS/BFS) LV3 - 타겟 넘버 (0) | 2022.01.20 |
| 프로그래머스 해시 LV2 - 위장 (0) | 2021.10.22 |