Algorithm
프로그래머스
Java
베스트 앨범

베스트 앨범 42579

https://school.programmers.co.kr/learn/courses/30/lessons/42579 (opens in a new tab)

풀이

public int[] solution(String[] genres, int[] plays) {
    HashMap<String, ArrayList<int[]>> genreMap = new HashMap<>();
    HashMap<String, Integer> playMap = new HashMap<>();
 
    // ❶ 장르별 총 재생 횟수와 각 곡의 재생 횟수 저장
    for (int i = 0; i < genres.length; i++) {
        String genre = genres[i];
        int play = plays[i];
        if (!genreMap.containsKey(genre)) {
            genreMap.put(genre, new ArrayList<>());
            playMap.put(genre, 0);
        }
        genreMap.get(genre)
                .add(new int[]{i, play});
        playMap.put(genre, playMap.get(genre) + play);
    }
 
    ArrayList<Integer> answer = new ArrayList<>();
 
    // ❷ 총 재생 횟수가 많은 장르순으로 내림차순 정렬
    Stream<Map.Entry<String, Integer>> sortedGenre = playMap.entrySet()
            .stream()
            .sorted((o1, o2) -> Integer.compare(o2.getValue(), o1.getValue()));
 
    // ❸ 각 장르 내에서 노래를 재생 횟수 순으로 정렬해 최대 2곡까지 선택
    sortedGenre.forEach(entry -> {
        Stream<int[]> sortedSongs = genreMap.get(entry.getKey())
                .stream()
                .sorted((o1, o2) -> Integer.compare(o2[1], o1[1]))
                .limit(2);
        sortedSongs.forEach(song -> answer.add(song[0]));
    });
 
    return answer.stream()
            .mapToInt(Integer::intValue)
            .toArray();
}