문제 링크 - https://school.programmers.co.kr/learn/courses/30/lessons/42579
HashMap<String, Integer> map
자료형에 장르별로 재생횟수를 더해서 오름차순으로 정렬한 값을 반환하였다. 이때List<Map.Entry<String,Integer>>
자료형에 담아서 정렬하였다HashMap<String, Integer> map = new HashMap<String,Integer>();
for(int i=0; i<genres.length; i++){
if(map.containsKey(genres[i])) // map에 해당 장르(key)가 있으면 재생횟수 누적.
map.put(genres[i],map.get(genres[i])+plays[i]);
else
map.put(genres[i],plays[i]); // map에 해당 장르(key)가 없으면 그대로 삽입
}
List<Map.Entry<String,Integer>> entryList = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
entryList.sort((o1,o2)->o2.getValue()-o1.getValue()); // 재생횟수 기준 내림차순으로 정렬
List<Map.Entry<String,Integer>>
형태인 entryList
에 재생횟수 기준 오름차순으로 (장르이름, 재생횟수) entry 가 겨있게 된다.entryList
를 돌면서 각 장르마다 해당하는 곡(Music 자료형)을 새로운 ArrayList<Music> list
에 담는다.Music
클래스를 정의할 때, 재생횟수 내림차순으로 정렬하되, 같으면 고유번호 오름차순 정렬
하도록 정렬조건을 정의 해 놓았다. int cnt=0; //cnt: 정답배열인 answer[]의 사이즈 구하기
ArrayList<Integer> answers= new ArrayList<Integer>();
for(Map.Entry<String,Integer> entry : entryList){
String curGenre = entry.getKey();
ArrayList<Music> list = new ArrayList<Music>();
for(int i=0; i<genres.length; i++){
if(genres[i].equals(curGenre))
list.add(new Music(i,plays[i]));
}
Collections.sort(list); // Music class에 정의한 정렬 조건에 따라서 정렬 (재생횟수 내림차순, 인덱스 오름차순)
ArrayList<Integer> answers
에 정답에 해당하는 노래 번호들을 담아 놓고, answers의 크기만큼 answer배열의 크기를 정해준 후 옮겨 담았다. int cnt=0; //cnt: 정답배열인 answer[]의 사이즈 구하기
if(list.size()>1){ // 장르에 속한곡이 2개 이상이면
answers.add(list.get(0).index);
answers.add(list.get(1).index);
cnt+=2;
}else if(list.size()==1){
answers.add(list.get(0).index);
cnt+=1;
}
}
//ArrayList에 담은 정답들 int[]배열에 옮겨주기
int[] answer= new int[cnt];
for(int i=0; i<cnt; i++){
answer[i]=answers.get(i);
}
return answer;
import java.util.*;
class Music implements Comparable<Music>{
int index;
int plays;
public Music(int index, int plays){
this.index=index;
this.plays=plays;
}
@Override
public int compareTo(Music m){ // 재생횟수 내림차순으로 정렬하되, 같으면 고유번호 오름차순 정렬
if(this.plays==m.plays)
return this.index-m.index; // 고유번호 오름차순
return m.plays-this.plays; //재생횟수 내림차순
}
}
class Solution {
public int[] solution(String[] genres, int[] plays) {
HashMap<String, Integer> map = new HashMap<String,Integer>();
for(int i=0; i<genres.length; i++){
if(map.containsKey(genres[i]))
map.put(genres[i],map.get(genres[i])+plays[i]);
else
map.put(genres[i],plays[i]);
}
List<Map.Entry<String,Integer>> entryList = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
entryList.sort((o1,o2)->o2.getValue()-o1.getValue());
// for(Map.Entry<String,Integer>entry: entryList){
// System.out.println("key: "+entry.getKey()+", value: "+entry.getValue());
// }
int cnt=0; //cnt: 정답배열인 answer[]의 사이즈 구하기
ArrayList<Integer> answers= new ArrayList<Integer>();
for(Map.Entry<String,Integer> entry : entryList){
String curGenre = entry.getKey();
ArrayList<Music> list = new ArrayList<Music>();
for(int i=0; i<genres.length; i++){
if(genres[i].equals(curGenre))
list.add(new Music(i,plays[i]));
}
Collections.sort(list); // Music class에 정의한 정렬 조건에 따라서 정렬 (재생횟수 내림차순, 인덱스 오름차순)
if(list.size()>1){ // 장르에 속한곡이 2개 이상이면
answers.add(list.get(0).index);
answers.add(list.get(1).index);
cnt+=2;
}else if(list.size()==1){
answers.add(list.get(0).index);
cnt+=1;
}
}
//ArrayList에 담은 정답들 int[]배열에 옮겨주기
int[] answer= new int[cnt];
for(int i=0; i<cnt; i++){
answer[i]=answers.get(i);
}
return answer;
}
}