문제 설명 url : https://programmers.co.kr/learn/courses/30/lessons/42579
문제 풀이 (주석 확인) :
import java.util.*; class BestAlbum { public int[] solution(String[] genres, int[] plays) { HashMap<String, Integer> hm = new HashMap<String, Integer>(); //hm : 각 장르별 전체 플레이수를 비교하기 위함 HashMap<Integer, String> genresMap = new HashMap<Integer, String>(); HashMap<Integer, Integer> playMap = new HashMap<Integer, Integer>(); //장르별 플레이 횟수, ex) pop : 600+2500 = 3100, classic : 500+150+800 = 1450 for (int i = 0; i < genres.length; i++) { if (hm.containsKey(genres[i])) { // 같은 장르가 있으면 + hm.put(genres[i], hm.get(genres[i]) + plays[i]); } else { // 새로운 장르 hm.put(genres[i], plays[i]); //System.out.println("put : " + hm.get(genres[i])); } } for (int i = 0; i < genres.length; i++) { // 장르와 플레이수를 각각 다른 해쉬맵(genresMap, playMap)에 저장 genresMap.put(i, genres[i]); playMap.put(i, plays[i]); } //정렬, hashmap의 key를 정렬할 땐 TreeSet을 이용하면 쉽게 정렬이 가능함 //value로 정렬해주는 컬렉션은 존재하지 않아서 Comparator 인터페이스를 이용하여 정렬 Iterator it = sortByValue(hm).iterator(); ArrayList<String> genresIndexAl = new ArrayList<String>(); while (it.hasNext()) { String temp = (String) it.next(); //System.out.println(temp + " = " + hm.get(temp)); genresIndexAl.add(temp);//genresIndexAl 0번째요소 : pop = 3100, 1번째요소 : classic = 1450 } //장르별 많이 플레이 된 노래의 고유번호 찾기 ArrayList<Integer> fIndex = new ArrayList<Integer>(); for(int i = 0; i<genresIndexAl.size(); i++){ // 각 장르 별로 for문, 예제는 pop, classic으로 총 2번 진행됨 int idx = 0; //각 장르(pop, classic)가 총 몇개인지 셈 for(int p1 : genresMap.keySet()){ if(genresIndexAl.get(i).equals(genresMap.get(p1))){ idx++; } } //장르 개수만큼 임시 배열 생성하고, plays 넣음 int[] temp = new int[idx]; int k = 0; for(int p2 : genresMap.keySet()){ if(genresIndexAl.get(i).equals(genresMap.get(p2))){ temp[k] = playMap.get(p2); k++; } } System.out.println(temp.length); for (int q = 0; q< temp.length;q++){ System.out.println("temp ["+q+"] : "+ temp[q]); } //플레이수 정렬 if(temp.length != 1){ Arrays.sort(temp); // 내림차순 for(int j = temp.length - 1; j >= temp.length - 2; j--){ //뒤부터 순회, 큰값부터 for(int p : playMap.keySet()){ // 인덱스 찾기 if(temp[j] == playMap.get(p)){ fIndex.add(p); playMap.put(p, 0); break; } } } }else{ // genres[]에 장르 종류가 1개, 정렬필요x, temp순회x for(int p : playMap.keySet()){ if(temp[0] == playMap.get(p)){ fIndex.add(p); playMap.put(p, 0); break; } } } } for(int a : playMap.keySet()){ System.out.println("playMap : "+ playMap.get(a)); } int[] answer = new int[fIndex.size()]; //ArrayList -> Array for(int i = 0; i < fIndex.size(); i++){ answer[i] = fIndex.get(i); } return answer; } public static List sortByValue(final Map map) { ArrayList<String> list = new ArrayList(); list.addAll(map.keySet()); Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { Object v1 = map.get(o1); Object v2 = map.get(o2); return ((Comparable) v1).compareTo(v2); } }); Collections.reverse(list); return list; } }