[프로그래머스] Level3 - 베스트앨범

 
by 박신종

> 문제

문제 : [베스트앨범]



> 문제풀이

해시맵 정렬하여 사용하였다.

문제를 이해하면 어렵지 않은 문제다.

한 장르에 두개 이상의 노래가 있다면 재생된 수가 큰 순으로 선택하고, 노래가 하나있다면 하나만 선택한다.

import java.util.*;
class Solution {
    static class Music implements Comparable<Music>{
        int index, plays;
        Music(int index, int plays){
            this.index = index;
            this.plays = plays;
        }
        @Override
        public int compareTo(Music m){
            if(m.plays == this.plays) return this.index - m.index;
            return m.plays - this.plays;
        }
    }
    
    static class Genre {
        Queue<Music> musics;
        int plays;
        Genre(){
            musics = new PriorityQueue<>();
        }
        public void addMusic(Music m){
            musics.add(m);
        }
    }
    
    public int[] solution(String[] genres, int[] plays) {
        Map<String, Genre> map = new HashMap<>();
        for(int i=0; i<genres.length; i++){
            String genre = genres[i];
            if(map.get(genre) == null) map.put(genre, new Genre());
            Genre g = map.get(genre);
            g.plays += plays[i];
            g.addMusic(new Music(i, plays[i]));
        }
        
        List<Integer> answerList = new ArrayList<>();
        List<String> keySetList = new ArrayList<>(map.keySet());
        Collections.sort(keySetList, (o1, o2) -> (map.get(o2).plays - map.get(o1).plays));
        
        while(!keySetList.isEmpty()){
            Genre g = map.get(keySetList.get(0));
            answerList.add(g.musics.poll().index);
            if(!g.musics.isEmpty()) answerList.add(g.musics.poll().index);
            keySetList.remove(0);
        }
        int[] answer = new int[answerList.size()];
        for(int i=0; i<answer.length; i++) {
        	answer[i] = answerList.get(i);
        }
        return answer;
    }
}




문제 출처 : Programmers