import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
Map<String,Integer> map=new HashMap<>();
List<Genre> arr=new ArrayList<>();
List<Integer> result=new ArrayList<>();
for(int i=0;i<genres.length;i++)
map.put(genres[i],map.getOrDefault(genres[i],0)+plays[i]);
for(String s:map.keySet())
arr.add(new Genre(s,map.get(s)));
Collections.sort(arr,(a,b)->b.plays-a.plays);
for(Genre g:arr){
List<Play> play=new ArrayList<>();
for(int i=0;i<genres.length;i++){
if(genres[i].equals(g.genre)) play.add(new Play(i,plays[i]));
}
Collections.sort(play,(a,b)->b.play-a.play);
for(int i=0;i<2;i++){
if(play.size()==1){
result.add(play.get(i).index);
break;
}
result.add(play.get(i).index);
}
}
int[] answer = new int[result.size()];
for(int i=0;i<result.size();i++) answer[i]=result.get(i);
return answer;
}
}
class Genre{
String genre;
int plays;
Genre(String genre,int plays){
this.genre=genre;
this.plays=plays;
}
}
class Play{
int index;
int play;
Play(int index,int play){
this.index=index;
this.play=play;
}
}
어렵게 생각할 것이 없다. 의식의 흐름대로 구현해주면 된다.
(1) 먼저, 가장 많이 재생된 순서대로 장르를 나열해야 한다.
(2) arr을 앞에서부터 확인한다.(재생횟수가 많은 장르 순으로 정렬되어 있음)
(3) 위 과정을 반복한 후, result의 요소들을 answer 배열에 옮겨담고 반환한다.
뭔가 더 간단하게 풀 수 있는 방법이 있을 것 같아서 좀 오래 고민해봤는데, 이게 최선인 것 같다. 그냥 문제에서 하라는대로 순서대로 하면 된다.
3레벨 문제치고 어렵지 않은 문제였다.
출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges