본문 바로가기
CS/Algorithm

[Programmers/Java] 베스트앨범

by 깐니 2022. 11. 8.

문제링크 => 베스트앨범

 

풀이.

1. unsortedGenreMap : 장르별 합계를 위해 HashMap<장르, 총재생수> 를 선언함.

2. reverseSortedGenreMap : 1의 HashMap을 value값인 총재생수의 내림차순으로 정렬함.

3. reverseSortedGenreMap을 순회

(1) unsortedPlayMap : HashMap<노래 고유번호, 노래 재생수> 를 선언함

(2) reverseSortedPlayMap : (1)의 HashMap을 value값인 노래 재생수의 내림차순으로 정렬함.

(3) reverseSortedPlayMap 중 2개씩만 정답 배열에 삽입

 

import java.util.*;

class Solution {

    public int[] solution(String[] genres, int[] plays) {
        List<Integer> answer = new ArrayList<>();

        // 1
        HashMap<String, Integer> unsortedGenreMap = new HashMap<>();
        LinkedHashMap<String, Integer> reverseSortedGenreMap = new LinkedHashMap<>();
        for(int i=0; i<plays.length; i++){
            unsortedGenreMap.put(genres[i], unsortedGenreMap.getOrDefault(genres[i], 0) + plays[i]);
        }

        // 2
        unsortedGenreMap.entrySet()
                .stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                .forEachOrdered(i -> reverseSortedGenreMap.put(i.getKey(), i.getValue()));

        // 3
        Iterator<String> iter = reverseSortedGenreMap.keySet().iterator();
        while(iter.hasNext()){
        	// (1)
            String key = iter.next();
            HashMap<Integer, Integer> unsortedPlayMap = new HashMap<>();
            for(int i=0; i<genres.length; i++){
                if(genres[i].equals(key)) unsortedPlayMap.put(i ,plays[i]);
            }

            // (2)
            LinkedHashMap<Integer, Integer> reverseSortedPlayMap = new LinkedHashMap<>();
            unsortedPlayMap.entrySet()
                    .stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                    .forEachOrdered(i->reverseSortedPlayMap.put(i.getKey(), i.getValue()));

            // (3)
            Iterator<Integer> subIter = reverseSortedPlayMap.keySet().iterator();
            int cnt = 2;
            while(subIter.hasNext() && cnt > 0){
                cnt -= 1;
                Integer idx = subIter.next();
                answer.add(idx);
            }
        }

        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

'CS > Algorithm' 카테고리의 다른 글

[Programmers/Java] 자연수 뒤집어 배열로 만들기  (0) 2022.11.04