import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
HashMap<String, GenreData> hm = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
GenreData gd;
if (!hm.containsKey(genres[i])) {
gd = new GenreData();
hm.put(genres[i], gd);
}
else {
gd = hm.get(genres[i]);
}
gd.add(plays[i], i);
}
PriorityQueue<GenreData> pq = new PriorityQueue<>();
for (GenreData value : hm.values()) {
pq.add(value);
}
ArrayList<Integer> al = new ArrayList<>();
while (!pq.isEmpty()) {
GenreData gd = pq.poll();
PriorityQueue<SongData> sdpq = gd.pq;
for (int i = 0; i < 2 && !sdpq.isEmpty(); i++) {
al.add(sdpq.poll().idx);
}
}
answer = new int[al.size()];
for (int i = 0; i < al.size(); i++) {
answer[i] = al.get(i);
}
return answer;
}
}
class GenreData implements Comparable<GenreData> {
int plays;
PriorityQueue<SongData> pq;
GenreData() {
plays = 0;
pq = new PriorityQueue<>();
}
void add(int play, int song) {
plays += play;
pq.add(new SongData(song, play));
}
public int compareTo(GenreData target) {
return target.plays - this.plays;
}
}
class SongData implements Comparable<SongData> {
int idx;
int play;
SongData(int idx, int play) {
this.idx = idx;
this.play = play;
}
public int compareTo(SongData target) {
return this.play != target.play ? target.play - this.play : this.idx - target.idx;
}
}
그냥 프로그램을 하나 개발하는것같았던 문제였다. 클래스를 많이 만들어서 그런가?
comparable에 대해 공부할 수 있는 기회였다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges