문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
정렬만? 잘하면 되는 문제이다.
1. 장르별로 재생횟수를 Map에 저장한다. 키는 장르, 밸류는 총 합을 저장한다.
2. 장르별로 리스트 객체를 관리한다. 이 때 리스트안에는 고유번호와 플레이 횟수를 저장한다.
2 - 1. 이 때도 Map 을 사용해서 키 값은 장르로 하고, 밸류는 고유번호와 플레이 횟수를 저장하는 클래스로 한다.
3. 저장을 모두 했다면 총 플레이 횟수가 가장 많은 장르부터 뽑아야한다. 이 때는 Priority Queue를 선언해서,
총 플레이 횟수가 많은 장르부터 꺼내도록 한다. Priority Queue 에 들어가는것도 장르, 총횟수 값을 필드로 하는 클래스 를 하나 선언해서 넣어준다.
4. 장르를 뽑았다면 2번에서 관리하는 리스트를 뽑고, 리스트를 플레이횟수 내림차순, 고유번호 오름차순으로 정렬한다.
5. 데이터가 2개 이상인지 검사하고 정답 배열에 추가해준다.
코드
import java.util.*;
class Solution {
static class Genre {
public String genreName;
public int totalPlayCnt;
public Genre(String genreName, int totalPlayCnt) {
this.genreName = genreName;
this.totalPlayCnt = totalPlayCnt;
}
}
static class Music {
public int personalNum;
public int playCnt;
public Music(int personalNum, int playCnt) {
this.personalNum = personalNum;
this.playCnt = playCnt;
}
}
public List<Integer> solution(String[] genres, int[] plays) throws Exception {
List<Integer> answer = new ArrayList<>();
Map<String, Integer> genreMap = new HashMap<>(); // 장르별 총 재생 횟수 Map
Map<String, List<Music>> musicMap = new HashMap<>(); // 장르내 음악들의 고유번호와 재생 횟수 Map
for (int i = 0; i < genres.length; i++) {
String genreName = genres[i];
int playCnt = plays[i];
if(genreMap.containsKey(genreName)){
genreMap.put(genreName, genreMap.get(genreName) + playCnt);
musicMap.get(genreName).add(new Music(i, playCnt));
} else{
genreMap.put(genreName, playCnt);
List<Music> list = new ArrayList<>();
list.add(new Music(i, playCnt));
musicMap.put(genreName, list);
}
}
// Map 을 pq 로 변환
PriorityQueue<Genre> pq = new PriorityQueue<>(((o1, o2) -> o2.totalPlayCnt - o1.totalPlayCnt));
for (String s : genreMap.keySet()) {
pq.add(new Genre(s, genreMap.get(s)));
}
// pq 에서 값이 큰 것부터 꺼낸다.
while(!pq.isEmpty()){
Genre poll = pq.poll();
String genreName = poll.genreName;
List<Music> musicList = musicMap.get(genreName);
musicList.sort((o1, o2) -> {
if(o1.playCnt == o2.playCnt){
return o1.personalNum - o2.personalNum;
}
return o2.playCnt - o1.playCnt;
});
if(musicList.size() < 2){
answer.add(musicList.get(0).personalNum);
continue;
}
answer.add(musicList.get(0).personalNum);
answer.add(musicList.get(1).personalNum);
}
return answer;
}
}
후기
'프로그래머스' 카테고리의 다른 글
LV3 - 여행경로 (Java) (0) | 2024.12.30 |
---|---|
LV3 - 단속 카메라 (Java) (0) | 2024.12.22 |
LV2 - 리코쳇 로봇 (Java) (2) | 2024.12.16 |
LV2 - 미로 탈출 (0) | 2024.07.04 |
LV2 - 무인도 여행 (Java) (0) | 2024.07.03 |