> 문제
문제 : [베스트앨범]
> 문제풀이
해시맵 정렬하여 사용하였다.
문제를 이해하면 어렵지 않은 문제다.
한 장르에 두개 이상의 노래가 있다면 재생된 수가 큰 순으로 선택하고, 노래가 하나있다면 하나만 선택한다.
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