전체적으로 풀다가 5~14번 테스트 케이스만 틀리길래 질문하기를 통해서 그 답을 찾았다... 참고 풀이
문제를 좀 더 꼼꼼히 읽어야 했다......
나의 접근법은
map<String, ArrayList<Play>>
라는 코드를 통해 접근하였다.
class : (0번, 500), (2번, 150), (3번, 800)
pop : (1번, 600), (4번, 2500)
그리고 sumMap을 두어 각 장르의 play합들을 저장하는 map을 선언하였다.
class : 1450
pop : 3100
그 이후 각 map들의 key의 ArrayList를 sort해주었다.
그리고 maxList<>
를 두어 가장 많이 재생된 항목을 찾도록 하였다. 이후 maxList를 sort하게 되면 가장 많이 재생된 항목별로 나오게 되며
for문으로 maxList를 순차 탐색하면서 최대 2개씩만 넣어주도록 하였다.
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
int n = genres.length;
int[] answer = {};
Map<String, ArrayList<Play>> map = new HashMap<>();
Map<String, Integer> sumMap = new HashMap<>();
for(int i = 0; i < n; i++){
if(!map.containsKey(genres[i])){
map.put(genres[i], new ArrayList<Play>());
}
map.get(genres[i]).add(new Play(i, plays[i]));
sumMap.put(genres[i], sumMap.getOrDefault(genres[i], 0) + plays[i]);
}
ArrayList<maxPlay> maxList = new ArrayList<>();
for(String key : map.keySet()){
Collections.sort(map.get(key));
maxList.add(new maxPlay(key, sumMap.get(key)));
}
Collections.sort(maxList);
ArrayList<Integer> answerList = new ArrayList<>();
for(int i = 0; i < maxList.size(); i++){
String gen = maxList.get(i).gen;
int maxIndex = (map.get(gen).size()) >= 2 ? 2 : map.get(gen).size();
for(int j = 0; j < maxIndex; j++){
answerList.add(map.get(gen).get(j).num);
}
}
return answerList.stream().mapToInt(Integer::intValue).toArray();
}
public class Play implements Comparable<Play>{
int num;
int play;
public Play(int num, int play){
this.num = num;
this.play = play;
}
@Override
public int compareTo(Play other){
return Integer.compare(other.play, this.play);
}
}
public class maxPlay implements Comparable<maxPlay>{
String gen;
int maxplay;
public maxPlay(String gen, int maxplay){
this.gen = gen;
this.maxplay = maxplay;
}
@Override
public int compareTo(maxPlay other){
return Integer.compare(other.maxplay, this.maxplay);
}
}
}