문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/42579
제한 사항
입출력 예
풀이
import java.util.PriorityQueue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Comparator;
import static java.util.Map.Entry;
import static java.util.AbstractMap.SimpleEntry;
class Solution {
public int[] solution(String[] genres, int[] plays) {
ArrayList<Integer> answer = new ArrayList<>();
HashMap<String, Integer> genreSumMap = new HashMap<>();
HashMap<String, PriorityQueue<Entry<Integer, Integer>>> genrePlays
= new HashMap<>();
PriorityQueue<Entry<String, Integer>> genreRankQueue
= new PriorityQueue<>((e1, e2) -> e2.getValue() - e1.getValue());
for (int i = 0; i < genres.length; i++) {
PriorityQueue<Entry<Integer, Integer>> temp;
if (genrePlays.containsKey(genres[i])) {
temp = genrePlays.get(genres[i]);
temp.add(new SimpleEntry(i, plays[i]));
} else {
temp = new PriorityQueue<>(
Comparator.comparing(Entry<Integer, Integer>::getValue, Comparator.reverseOrder())
.thenComparing(Entry<Integer, Integer>::getKey)
);
temp.add(new SimpleEntry(i, plays[i]));
genrePlays.put(genres[i], temp);
}
genreSumMap.put(genres[i], genreSumMap.getOrDefault(genres[i], 0) + plays[i]);
}
genreRankQueue.addAll(genreSumMap.entrySet());
while (genreRankQueue.size() > 0) {
String genre = genreRankQueue.poll().getKey();
PriorityQueue<Entry<Integer, Integer>> genreQueue = genrePlays.get(genre);
answer.add(genreQueue.poll().getKey());
if (genreQueue.size() > 0)
answer.add(genreQueue.poll().getKey());
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
후기
이중 정렬 처리만 신경 쓰고 Map으로 합을 저장 및 같은 장르 안에서 재생 수를 저장하는 처리만 잘하면 크게 어렵지 않은 문제이다.
그런데 나는 코드를 어떻게 보기 좋게 작성할 수 있을지 고민하는 것이 더 어려운 것 같다. 위 작성한 코드도 맘에 안 들기는 하는데 앞으로 문제를 풀 때 어떻게 깔끔하게 풀 지 좀 고민해 봐야겠다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
[프로그래머스][Java][Lv. 2] 가장 큰 수 (1) | 2024.12.09 |
---|---|
[프로그래머스][Java][Lv. 3] 스티커 모으기(2) (0) | 2024.09.18 |
[프로그래머스][Java][Lv. 3] 기지국 설치 (1) | 2024.09.13 |
[프로그래머스][Java][Lv. 3] 최고의 집합 (0) | 2024.09.11 |
[프로그래머스][Java][Lv. 3] 단속카메라 (0) | 2024.09.10 |