programmers 베스트앨범 java

밍디·2021년 10월 21일
0
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;
    }
}
profile
노후를 위해 꾸준히 공부하자.

0개의 댓글