목표

  1. 같은 장르가 많은 노래 그룹을 먼저 수록합니다.
  2. 같은 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

조건

  • genres[i]는 고유번호가 i인 노래의 장르입니다.
  • plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
  • genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
  • 장르 종류는 100개 미만입니다.
  • 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
  • 모든 장르는 재생된 횟수가 다릅니다.

잡설

domain 구성하면 복잡하지 않게 해결될거같긴 한데 다른방법도 해보고 싶어서 나름 구성해보았으나… 저 sort 메서드를 합칠 방법이 뭐가 있을까?
분명히 저렇게 중복되는걸 자료형 선택해서 하나의 메서드로 합쳐 처리하는 방법이 있을텐데
그걸 모르겠네

코드

import java.util.*;
import java.util.Map.Entry;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        HashMap<String, HashMap<Integer, Integer>> music = new HashMap<>();
        HashMap<String, Integer> total = new HashMap<>();

        for (int index = 0, maxIndex = plays.length; index < maxIndex; index++) {
            HashMap<Integer, Integer> item;
            if (music.containsKey(genres[index])) {
                item = music.get(genres[index]);
                total.put(genres[index], total.get(genres[index]) + plays[index]);
            } else {
                item = new HashMap<>();
                total.put(genres[index], plays[index]);
            }
            item.put(index, plays[index]);
            music.put(genres[index], item);
        }

        List<Integer> answer = new ArrayList<>();
        for (String item : sortTotal(total).keySet()) {
            Set<Integer> sortedMusic = sortMusic(music.get(item)).keySet();
            int index = 0;
            for (Integer item2 : sortedMusic) {
                if (index++ > 1 ) {
                    break;
                }
                answer.add(item2);
            }
        }
        return answer.stream().mapToInt(i->i).toArray();
    }

    public LinkedHashMap<String, Integer> sortTotal(HashMap<String, Integer> total) {
        List<Entry<String, Integer>> list = new ArrayList<>(total.entrySet());
        list.sort(Entry.comparingByValue(Comparator.reverseOrder()));

        LinkedHashMap<String, Integer> sortedTotal = new LinkedHashMap<>();
        for (Entry<String, Integer> entry : list) {
            sortedTotal.put(entry.getKey(), entry.getValue());
        }

        return sortedTotal;
    }

    public LinkedHashMap<Integer, Integer> sortMusic(HashMap<Integer, Integer> music) {
        List<Entry<Integer, Integer>> list = new ArrayList<>(music.entrySet());
        list.sort(Entry.comparingByValue(Comparator.reverseOrder()));

        LinkedHashMap<Integer, Integer> sortedMusic = new LinkedHashMap<>();
        for (Entry<Integer, Integer> entry : list) {
            sortedMusic.put(entry.getKey(), entry.getValue());
        }

        return sortedMusic;
    }
}

댓글남기기