프로그래머스 고득점 kit 풀이 중
Map에 대한 foreach문 사용 사용 및 Comparable 구현 메모
@Override
public int compareTo(Music m){
if(this.plays == m.plays){
return this.idx - m.idx;
}
return m.plays - this.plays;
}
map.forEach((key, value) -> {
pq.offer(value);
});
if(map.get(g) != null){
map.get(g).addMusic(m);
} else {
map.put(g, new Genres());
map.get(g).addMusic(m);
}
map.computeIfAbsent(g, k -> new Genres()).addMusic(m);
import java.util.*;
class Solution {
class Music implements Comparable<Music>{
int plays, idx;
Music(int plays, int idx){
this.plays = plays;
this.idx = idx;
}
@Override
public int compareTo(Music m){
if(this.plays == m.plays){
return this.idx - m.idx;
}
return m.plays - this.plays;
}
}
class Genres implements Comparable<Genres>{
PriorityQueue<Music> music;
int total = 0;
Genres(){
music = new PriorityQueue<>();
}
public void addMusic(Music m){
music.offer(m);
total += m.plays;
}
@Override
public int compareTo(Genres g){
return g.total - this.total;
}
}
public int[] solution(String[] genres, int[] plays) {
Map<String, Genres> map = new HashMap<>();
for(int i = 0; i < genres.length; i++){
String g = genres[i];
int p = plays[i];
Music m = new Music(p, i);
if(map.get(g) != null){
map.get(g).addMusic(m);
} else {
map.put(g, new Genres());
map.get(g).addMusic(m);
}
}
PriorityQueue<Genres> pq = new PriorityQueue<>();
map.forEach((key, value) -> {
pq.offer(value);
});
ArrayList<Integer> list = new ArrayList<>();
while(!pq.isEmpty()){
Genres cur = pq.poll();
if(cur.music.size() == 1){
list.add(cur.music.poll().idx);
} else {
list.add(cur.music.poll().idx);
list.add(cur.music.poll().idx);
}
}
int[] answer = new int[list.size()];
for(int i = 0; i < answer.length; i++){
answer[i] = list.get(i);
}
return answer;
}
}