programmers.co.kr/learn/courses/30/lessons/42579
import java.util.*;
import java.util.Map.Entry;
class Solution {
class Song implements Comparable<Song>{
int id, play;
String genre;
Song(int id, int play, String genre){
this.id=id;
this.play=play;
this.genre=genre;
}
@Override
public int compareTo(Song o) {
// TODO Auto-generated method stub
if(this.play==o.play) {
return this.id-o.id;
}
else {
return o.play-this.play;
}
}
}
public int[] solution(String[] genres, int[] plays) {
ArrayList<Integer> result=new ArrayList<>();
ArrayList<Song> songList=new ArrayList<>();
HashMap<String, Integer> gMap=new HashMap<>();
HashMap<String, Integer> pMap=new HashMap<>();
for(int i=0;i<genres.length;i++) {
songList.add(new Song(i, plays[i], genres[i]));
if(gMap.containsKey(genres[i])) gMap.replace(genres[i], gMap.get(genres[i])+plays[i]);
else gMap.put(genres[i], plays[i]);
}
Collections.sort(songList, new Comparator<Song>() {
@Override
public int compare(Song o1, Song o2) {
if(o1.genre.equals(o2.genre)) return o1.compareTo(o2); //A.compareTo(B): A가 B보다 작으면 음수, 크면 양수, 같으면 0
else return gMap.get(o2.genre)-gMap.get(o1.genre);
}
});
for(Song s:songList) {
if(!pMap.containsKey(s.genre)) {
pMap.put(s.genre, 1);
result.add(s.id);
}
else {
if(pMap.get(s.genre)>=2) continue;
else {
pMap.replace(s.genre, pMap.get(s.genre)+1);
result.add(s.id);
}
}
}
int[] arr_result=new int[result.size()];
for(int i=0;i<result.size();i++) {
arr_result[i]=result.get(i);
}
return arr_result;
}
}
이번 문제를 풀면서 아래 링크를 참고하면서 풀었습니다.
먼저 id, genre, play 변수가 담겨 있는 Song 객체를 선언하고, Song 객체를 담을 ArrayList인 songList와 genre와 play를 각각 저장해줄 HashMap gMap, pMap을 선언해주었습니다.
gMap에는 장르별 플레이수를 저장해주었고, Collections.sort()를 이용해 songList를 장르별 플레이수에 따라 내림차순으로 정렬해주었습니다.
이후 for each문을 이용해 pMap이 key를 가지고 있지 않으면 pMap에 카로 genre를, 값으로 1을 지정해주고, ArrayList result에 Song의 id를 저장해줍니다.
만약 pMap에 이미 저장이 되어있어 key를 포함하고 있는 Song 객체라면, pMap의 값이 2 이상이면 넘어가고 그렇지 않으면 result 리스트에 Song 객체의 id 값을 저장해줍니다.
이렇게 하는 이유는 각 장르별로 플레이 수가 가장 많은 곡을 두 개까지 추가하려 하기 때문입니다.
'프로그래밍 문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 기능개발(JAVA) (0) | 2020.09.17 |
---|---|
[프로그래머스] 주식가격(JAVA) (0) | 2020.09.17 |
[프로그래머스] 위장(JAVA) (0) | 2020.09.17 |
[프로그래머스] 전화번호 목록(JAVA) (0) | 2020.09.03 |
[프로그래머스] 완주하지 못한 선수(JAVA) (0) | 2020.09.01 |