너무 너무 어려븜..
해시 맵 구조
public class Programmers42579 {
public static int[] solution(String[] genres, int[] plays){
// String = 장르 이름
// int[x][y]
// x=장르 내 순위x인 곡의 인덱스(ex)0은 1위)
// y=장르 내 순위 x인 곡의 재생횟수
// [2][0]은 전체 장르 재생 횟수를 의미함
HashMap<String, int[][]> hm = new HashMap<>();
for(int i=0;i<genres.length;i++){
//장르가 처음 등록되는것
if(hm.get(genres[i])==null){
int [][]info = {{-1,-1},{-1,-1},{-1,-1}};
//1순위에 해당 곡의 정보 넣어줌
info[0][0]=i; info[0][1]= plays[i]; info[2][0]=plays[i];
hm.put(genres[i],info);
continue;
}
int [][]info = hm.get(genres[i]); //현 장르의 전체 재생 횟수 늘림
info[2][0]+=plays[i];
for(int j=0;j<2;j++){
if(info[j][1]<plays[i]){ //같은 장르의 새로운 곡이 더 재생횟수 많음
//이미 등록된것보다 많을때
int tmpIndex = info[j][0]; //이전곡의 인덱스 저장
int tmpPlay = info[j][1]; //이전곡의 횟수 저장
info[j][0]=i; //현재 노래로 바뀜
info[j][1]=plays[i];
if(j==0){ //1등하고 자리바꿈시 2등에 이전의 1등을 넣어줌
info[1][0]=tmpIndex;
info[1][1]=tmpPlay;
break;
}
}
}
hm.put(genres[i],info); //바뀐 info를 저장
}
//특정 장르의 전체 재생 횟수를 키값으로(유일함) <횟수,장르> 로 저장하는 해시맵
HashMap<Integer,String> hmGenreLank = new HashMap<>();
for (String s : hm.keySet()) {
hmGenreLank.put(hm.get(s)[2][0],s);
}
//횟수를 기준으로 내림차순으로 정리(장르랭킹)
List<Integer> playLanks = new ArrayList<>(hmGenreLank.keySet());
playLanks.sort(Comparator.reverseOrder());
//정답리스트
ArrayList<Integer> ansList = new ArrayList<>();
//1순위부터 각 장르의 1,2등 저장
for (Integer playLank : playLanks) {
for(int i=0;i<2;i++){
if(hm.get(hmGenreLank.get(playLank))[i][1]!=-1){
ansList.add(hm.get(hmGenreLank.get(playLank))[i][0]);
}
}
}
int[] ans = new int[ansList.size()];
int size = 0;
for(Integer integer:ansList){
ans[size++] = integer;
}
return ans;
}
public static void main(String[] args) {
String genres[]={"classic", "Newage", "pop", "classic", "classic", "pop", "Newage"};
int plays[] = {500, 1700, 600, 150, 800, 2500, 1500};
System.out.println(Arrays.toString(solution(genres,plays)));
}
}
Java
복사