ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Programmers LV.3 베스트앨범
    Programmers 2020. 12. 19. 18:34

     

     

    처음에 짯을때는 아래와 같이 짯는데,

     

    짜다보니 Value 즉 playCount가 동일할수있을수도 있는데... 라는 의문을 계속맘에 품으면서 작업하다가

    결국 최종 코드에서 2/15번 케이스에 막혀서 다시 돌아오기로 하였다

     

    나처럼 2/15번 케이스가 막힐 경우

    String[] genres = {"classic","classic","classic","classic","pop"};
                int[] plays = {500,150,800,800,2500};

    를 테스트 케이스로 잡고 개발하면 좋을 것 같다.

     

      @org.junit.Test
             public void test(){
                // 장르별 재생횟수 총 합
                    Map<String,Integer> genrePlaySumCntMap = new HashMap<String,Integer>();
    
                    // 장르별 id / play 횟수
                    Map<String , Map<Integer,Integer>> genrePlayList = new HashMap<String, Map<Integer, Integer>>();
    
    
    
                    //재생횟수가 많은 순으로 들어감 ( 장르별 모든 재생횟수총합 )
                    TreeMap<Integer,String> sortGenrePlaySumCntCompareMap =  new TreeMap<>(Collections.reverseOrder());
    
                    for(int a=0; a < genres.length; a++){
    
                        // 장르별 재생횟수 총 합 추가
                        genrePlaySumCntMap.put(genres[a],genrePlaySumCntMap.getOrDefault(genres[a] , 0) + plays[a]);
    
                        Map<Integer,Integer> playIdAndCnt = genrePlayList.get(genres[a]) == null ? new HashMap<>() : (HashMap)genrePlayList.get(genres[a]) ;
                        playIdAndCnt.put( a , plays[a]);
                        genrePlayList.put(genres[a],playIdAndCnt);
                    }
    
    
                    // 장르별 합
                    genrePlaySumCntMap.forEach( (k,v) ->  sortGenrePlaySumCntCompareMap.put(v,k));
    
                    ArrayList<Integer> answerIdList = new ArrayList<>();
    
                    //재생횟수 많은 순서
                    for(String genre :  sortGenrePlaySumCntCompareMap.values()){
    
                        Map<Integer,Integer> getGenrePlayList = genrePlayList.get(genre);
    
                        //장르별 재생횟수 많은 순
                        TreeMap<Integer,Integer> sortGenreTypePlay =  new TreeMap<>(Collections.reverseOrder());
    
                        getGenrePlayList.forEach((k,v) -> sortGenreTypePlay.put(v,k));
    
                        int cnt = 0;
                        for(Integer id : sortGenreTypePlay.values()){
                            if( cnt < 2) {
                                answerIdList.add(id);
                                cnt++;
                            }
                        }
                    }
    
    
                    int[] answer = new int[answerIdList.size()];
    
                    for(int i=0; i<answerIdList.size(); i++){
                        answer[i] = answerIdList.get(i);
                        System.out.println(answer[i]);
                    }

     

     

    실수한 부분은

     

    treemap 사용해서, put 하는 부분에 value가 중복될 경우 이슈가 발생 

     

    수정하여 아래와 같이 개발

     @org.junit.Test
                public void test(){
                String[] genres = {"classic","classic","classic","classic","pop"};
                int[] plays = {500,150,800,800,2500};
                   /* String[] genres = {"classic", "pop", "classic", "classic", "pop"};
                    int[] plays = {500, 600, 150, 800, 2500};*/
                    int[] playMergeCnt = {};
    
                    // 장르별 재생횟수 총 합
                    Map<String,Integer> genrePlaySumCntMap = new HashMap<String,Integer>();
    
                    // 장르별 id / play 횟수
                    Map<String , Map<Integer,Integer>> genrePlayList = new HashMap<String, Map<Integer, Integer>>();
    
    
    
                    //재생횟수가 많은 순으로 들어감 ( 장르별 모든 재생횟수총합 )
                    TreeMap<Integer,String> sortGenrePlaySumCntCompareMap =  new TreeMap<>(Collections.reverseOrder());
    
                    for(int a=0; a < genres.length; a++){
    
                        // 장르별 재생횟수 총 합 추가
                        genrePlaySumCntMap.put(genres[a],genrePlaySumCntMap.getOrDefault(genres[a] , 0) + plays[a]);
    
                        Map<Integer,Integer> playIdAndCnt = genrePlayList.get(genres[a]) == null ? new HashMap<>() : (HashMap)genrePlayList.get(genres[a]) ;
                        playIdAndCnt.put( a , plays[a]);
                        genrePlayList.put(genres[a],playIdAndCnt);
                    }
    
    
                    // 장르별 합
                    genrePlaySumCntMap.forEach( (k,v) ->  sortGenrePlaySumCntCompareMap.put(v,k));
    
                    ArrayList<Integer> answerIdList = new ArrayList<>();
    
                    //재생횟수 많은 순서
                    for(String genre :  sortGenrePlaySumCntCompareMap.values()){
    
                        Map<Integer,Integer> getGenrePlayList = genrePlayList.get(genre);
    
    
                        ArrayList<Integer> setGenreTypeID = new ArrayList<Integer>();
    
                        getGenrePlayList.forEach((k,v) -> setGenreTypeID.add(k));
    
                        Collections.sort(setGenreTypeID, new Comparator<Integer>() {
                            @Override
                            public int compare(Integer o1, Integer o2) {
                                if (plays[o1] == plays[o2]) {
                                    return Integer.compare(o1, o2);
                                }
                                else {
                                    return Integer.compare(plays[o2], plays[o1]);
                                }
                            }
                        });
    
                        int cnt = 0;
                        for(Integer id : setGenreTypeID){
                            if( cnt < 2) {
                                answerIdList.add(id);
                                cnt++;
                            }
                        }
                    }
    
    
    
                    int[] answer = new int[answerIdList.size()];
    
                    for(int i=0; i<answerIdList.size(); i++){
                        answer[i] = answerIdList.get(i);
                        System.out.println(answer[i]);
                    }
            }

    'Programmers' 카테고리의 다른 글

    Programmers LV.2 다리를 지나가는 트럭  (0) 2020.12.23
    Programmers LV.2 주식가격  (0) 2020.12.20
    Programmers LV.2 위장  (0) 2020.12.17
    Programmers LV.2 전화번호 목록  (0) 2020.12.16
    Programmers LV.1 완주하지 못한 선수  (0) 2020.12.16

    댓글

Designed by black7375.