https://school.programmers.co.kr/learn/courses/30/lessons/42579
문제
각 장르와 재생 수가 담긴 배열 두 개를 이용하여
베스트 앨범을 만들 때 각 장르당 2개씩 가장 많은 재생 수의 음악의 번호를 배열 형태로 출력해라.
이때, 장르 별로도 총 재생수가 많은 장르부터 먼저 수록한다.
풀이
Music 객체를 만든 다음, 이 객체로 이루어진 List를 생성하여 재생 수를 기준으로 정렬한다.
이후, 장르와 그 장르의 총 재생수를 저장하는 HashMap을 만들고, 이 역시도 List 형태로 만들어 정렬.
이후 장르의 총 재생수에 따라 각 음악의 List에서 이를 상위 2개씩만 뽑아와 고유 번호를 배열에 저장한 후 리턴.
소감
30분 컷.
어우씨...로직 자체는 이게 왜 lv3인가 의아할 정도로 쉽지만...
문제는 구현. 만약 이게 pccp였으면 로직은 바로 떠올려도 각 객체의 메소드 등등의 명칭으로 인해 골머리를 쌓았을 것이다.
여기서 기억해야할 건
1) 객체의 정렬방법
...implements Comparable<Music>
@Override
public int compareTo(Music o){
return o.play - play;
}
2) List를 비롯한 Collection의 정렬
Collections.sort(list);
3) 전체 Entry 뽑아오기
for(Entry<String, Integer> e : map.entrySet())
4) List를 Array로
arr = list.toArray(Integer[]::new);
//반대는 Arrays.toList(arr);
코드
import java.util.*;
import java.util.Map.*;
class Music implements Comparable<Music>{
int num;
String genre;
int play;
public Music(int num, String genre, int play){
this.num = num;
this.genre = genre;
this.play = play;
}
@Override
public int compareTo(Music o){
return o.play - play;
}
@Override
public String toString(){
return genre+" "+play;
}
}
class Solution {
public Integer[] solution(String[] genres, int[] plays) {
Integer[] answer = {};
ArrayList<Integer> score = new ArrayList<>();
LinkedList<Music> list = new LinkedList<>();
HashMap<String, Integer> map = new HashMap<>();
for(int i=0; i<genres.length; i++){
list.add(new Music(i, genres[i], plays[i]));
if(map.containsKey(genres[i])){
int play = map.get(genres[i]);
map.put(genres[i], play+plays[i]);
}
else map.put(genres[i], plays[i]);
}
Collections.sort(list);
LinkedList<Music> genreList = new LinkedList<>();
for(Entry<String, Integer> e : map.entrySet()){
genreList.add(new Music(0, e.getKey(), e.getValue()));
}
Collections.sort(genreList);
//System.out.println(list);
//System.out.println(genreList);
for(Music g : genreList){
String nowG = g.genre;
int cnt = 0;
for(Music m : list){
if(nowG.equals(m.genre) && cnt!=2){
cnt++;
score.add(m.num);
}
}
}
answer = score.toArray(Integer[]::new);
return answer;
}
}