[풀이]
우선순위를 기반으로 베스트 앨범에 들어갈 노래를 골라주면 된다.
1. 장르별 총 재생 수 기준 정렬
2. 각 장르별로 상위 2개의 노래 선택
장르별 총 재생 수를 저장하기 위해 totalPlays 라는 map을 선언했다.
해당 map의 key는 장르, value는 총 재생횟수가 된다.
totalPlays에 값을 넣어줄 때는 getOrDefault 함수를 사용해
현재 genre에 해당하는 값이 존재하면 그 값을 가져오고,
존재하지 않는다면 defaultValue인 0을 가져와 play 횟수를 더해준 값을 put 하도록 하였다.
또한 각 장르별 play를 관리하기 위해 genreInfo 라는 map을 선언했다.
마찬가지로 해당 map의 key는 genre 값이 되고, value로는 또 하나의 map이 된다.
value로 존재하는 map의 key는 고유 번호인 index 값, value는 해당 노래의 재생 횟수인 play를 저장한다.
이를 통해 genreInfo에서는 각 장르별 재생된 노래의 정보를 관리하고 있다.
genreInfo에 값을 넣어줄 때는 value가 HashMap이기 때문에
key에 해당하는 값이 존재하는지 확인 후 존재하지 않는다면 새로운 map을 할당하고 put을 수행한다.
장르별 총 재생 횟수를 기준으로 노래를 선발하기 위해
장르별 총 재생횟수 값이 존재하는 totalPlays를 정렬해줘야 한다.
이 때 List와 같은 컬렉션(Collection) 타입 데이터를 정렬하는데 사용되는 Collections.sort를 사용했다.
List<String> keySet = new ArrayList(totalPlays.keySet());
Collections.sort(keySet, (o1 , o2) -> totalPlays.get(o2) - totalPlays.get(o1));
totalPlays.keySet()를 통해 map의 모든 key 값을 가져와 ArrayList 형태로 변환해준다.
- Set은 정렬이 불가능하지만, List는 정렬이 가능하기 때문
Collections.sort는 주어진 List를 특정 조건에 따라 정렬 가능하다.
- 정렬 조건은 map의 두 키 o1과 o2의 value인 (totalPlays.get(o1)과 totalPlays.get(o2))을 기준으로 한다.
- (o1, o2) -> totalPlays.get(o2) - totalPlays.get(o1)는 내림차순 정렬을 나타낸다.
- totalPlays.get(o2)이 더 크다면 음수를 반환해 o2가 먼저 오도록 정렬.
- totalPlays.get(o1)이 더 크다면 양수를 반환해 o1이 나중에 오도록 정렬.
Java의 Comparator는 정렬 기준을 정의할 때 조건이 양수를 반환할 경우 o1이 o2보다 뒤에 가게 된다.
정렬된 map을 기반으로 순회하며 앨범에 넣을 곡을 선택한다.
장르 내에서 가장 많이 재생된 노래를 넣기 위해 다시 정렬을 수행한다.
List<Integer> sortedMap = new ArrayList(map.keySet());
Collections.sort(sortedMap, (o1 , o2) -> map.get(o2) - map.get(o1));
여기서의 map 변수에는 genre에 해당하는 곡들의 정보가 존재하는데
key는 곡의 고유번호가 되고, value는 해당 곡의 재생 횟수가 된다.
마찬가지로 key 값에 해당하는 값을 가져와 ArrayList로 변환하여 정렬을 수행한다.
key 값들을 가져와 key에 해당하는 value를 기준으로 map을 내림차순 정렬한다.
정렬된 값을 기반으로 index에 해당하는 map의 key 값을 answer에 넣어주면 된다.
[코드]
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
ArrayList<Integer> answer = new ArrayList<>();
int len = genres.length;
Map<String, Integer> totalPlays = new HashMap<>();
//key : genre, value < Key : idx, value : play>>
Map<String, HashMap<Integer , Integer>> genreInfo = new HashMap<>();
for(int idx =0 ; idx<len ; idx++){
String genre = genres[idx];
int play = plays[idx];
if(!genreInfo.containsKey(genre)) {
HashMap<Integer, Integer> map = new HashMap<>();
map.put(idx, play);
genreInfo.put(genre, map);
} else {
genreInfo.get(genre).put(idx , play);
}
totalPlays.put(genre, totalPlays.getOrDefault(genre, 0) + play);
}
List<String> keySet = new ArrayList(totalPlays.keySet());
// map을 value 기준으로 정렬
Collections.sort(keySet, (o1 , o2) -> totalPlays.get(o2) - totalPlays.get(o1));
for(String key : keySet) {
Map<Integer, Integer> map = genreInfo.get(key);
List<Integer> sortedMap = new ArrayList(map.keySet());
Collections.sort(sortedMap, (o1 , o2) -> map.get(o2) - map.get(o1));
answer.add(sortedMap.get(0));
if(sortedMap.size() > 1) {
answer.add(sortedMap.get(1));
}
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/42579
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 순위 (JAVA) (0) | 2024.12.10 |
---|---|
[프로그래머스] 입국심사 (JAVA) (0) | 2024.12.10 |
[프로그래머스] 섬 연결하기 (JAVA) (2) | 2024.12.09 |
[프로그래머스] 야근 지수 (JAVA) (0) | 2024.12.09 |
[프로그래머스] 이모티콘 할인 행사 (JAVA) (0) | 2024.12.09 |