-
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