import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
HashMap<String, Object> genresMap = new HashMap<String, Object>(); //<장르, 곡 정보>
HashMap<String, Integer> playMap = new HashMap<String, Integer>(); //<장르, 총 장르 재생수>
ArrayList<Integer> resultAL = new ArrayList<Integer>();
for(int i=0;i<genres.length;i++){
String key=genres[i];//장르를 하나씩 뽑아 key로 만듬.
HashMap<Integer,Integer> infoMap;//곡정보<곡 번호, 재생횟수>
if(genresMap.containsKey(key)){//그 장르가 만약, genresMap에 있다면?
infoMap = (HashMap<Integer, Integer>)genresMap.get(key);//그 장르에대한 value(곡정보)얻기.+형변환
System.out.println(key+infoMap);
/*
classic{0=500}
classic{0=500, 2=150}
pop{1=600}
**/
}else{ //genresMap에 없는 장르라면?
infoMap = new HashMap<Integer,Integer>();
//infoMap이라는 곡번호, 재생횟수 넣는 변수 만듦
}
infoMap.put(i, plays[i]);//곡정보에 곡번호, 재생횟수 넣음.
genresMap.put(key, infoMap);//genre에 장르, 곡정보를 넣음.
//playMap은 총 장르 재생수를 계산하는 또 새로운 해시맵
if(playMap.containsKey(key)){//만약 장르가 이미 있으면
playMap.put(key, playMap.get(key) + plays[i]);//그 장르 key에 대한 value에 그 장르 재생수를 더해줌
}
else {
playMap.put(key, plays[i]);//그장르가없다면 장르, 재생수넣어줌.
}
}
int mCnt = 0;
//총장르 재ㅐㅇ수를 sortByValue에 넣음.
System.out.println("playmap"+playMap);//playmap{pop=3100, classic=1450}
Iterator it = sortByValue(playMap).iterator();//playMap을 value로 정렬하기 위한 부분.
while(it.hasNext()){
//playMap에 있는 장르를 뽑아내서 genresmap에 잇는 {1=600, 4=2500} 이런 데이터를sortByValue에넣음
String key = (String)it.next();
Iterator indexIt = sortByValue((HashMap<Integer, Integer>)genresMap.get(key)).iterator();
//ketlist 인 1,4만 반환됨. 정렬이 되었으니 [4,1]이 되겠지?
System.out.println("결과 "+indexIt);
int playsCnt = 0;
while(indexIt.hasNext()){
resultAL.add((int)indexIt.next());
System.out.println("indexIt : "+resultAL);
mCnt++;
playsCnt++;
if(playsCnt > 1) break;
}
}
//장르별 2개씩.
/*아래는 배열리스트->배열로 타입만 변화하는 부분*/
int[] answer = new int[resultAL.size()];
for(int i = 0; i < resultAL.size(); i++){
answer[i] = resultAL.get(i).intValue();
}
return answer;
}
private ArrayList sortByValue(final Map map){
//46번째에줄에서 호출했을땐 {1=600, 4=2500}가 map으로 옴. 이거의 map set은 1,4인데 이게 keylist로 만들어지는 거임.
ArrayList<Object> keyList = new ArrayList();
System.out.println("keyset"+map.keySet());//처음엔 pop,classic에 출력되지. keyset이니
keyList.addAll(map.keySet());
//value를 통한 정렬 방법
//value가 내림 차순이 된다
Collections.sort(keyList, new Comparator(){
public int compare(Object o1, Object o2){
Object v1 = map.get(o1);
Object v2 = map.get(o2);
return ((Comparable) v2).compareTo(v1);
}
});
return keyList;
}
}