‘프로그래머스 코딩테스트 고득점 Kit’ 문제 입니다. 😀
문제 👉 <코딩테스트 연습 - 베스트앨범 | 프로그래머스>
1. 문제
- genres는 노래의 장르를 나타내는 문자열을 plays는 노래별 재생 횟수를 나타낸다.
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
- 모든 장르의 재생 횟수는 다르고, 장르에 속한 곡이 하나라면, 하나의 곡만 수록한다.
2. 풀이
해시
를 이용한 문제 풀이
- key는 장르를 value는 총 재생 횟수를 나타내는 Hash를 생성한다.
- key는 장르를 value는 {고유번호, 재생횟수}를 나타낼 수 있는 Hash를 생성한다.
- 재생횟수 내림차순
- 고유번호 오름차순
- 장르별 총 재생 횟수를 내림차순으로 정렬 후 총 재생 횟수가 높은 장르의 고유 번호를 리턴 배열에 추가한다.
3. 코드
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
Map<String, Integer> hmGenres = new HashMap<>();
Map<String, PriorityQueue<int []>> hmPlays = new HashMap<>(); // {고유번호, 재생 횟수}
for(int i=0; i<genres.length; i++){
hmGenres.put(genres[i], hmGenres.getOrDefault(genres[i], 0) + plays[i]);
// 재생 횟수 내림차순, 고유번호 오름차순
hmPlays.computeIfAbsent(genres[i], k ->
new PriorityQueue<>((o1, o2) -> o1[1] != o2[1] ? Integer.compare(o2[1], o1[1]) : Integer.compare(o1[0], o2[0]))
).add(new int[]{i, plays[i]});
}
// Map의 Value를 정렬하기 위해 List로 변환
List<Map.Entry<String, Integer>> list = new ArrayList<>(hmGenres.entrySet());
// 장르별 재생 횟수의 총합을 내림차순
Collections.sort(list, (o1, o2) -> Integer.compare(o2.getValue(), o1.getValue()));
List<Integer> answer = new ArrayList<>();
for(Map.Entry<String, Integer> entry : list){
int cnt = 0;
PriorityQueue<int[]> que = hmPlays.get(entry.getKey());
while(!que.isEmpty() && cnt < 2){
ans.add(que.poll()[0]);
cnt++;
}
}
// List -> int[]
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
References
🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 가장 큰 수 [JAVA(자바)] (0) | 2021.11.25 |
---|---|
[프로그래머스] 위장 [JAVA(자바)] (0) | 2021.11.25 |
[프로그래머스] 전화번호 목록 [JAVA(자바)] (0) | 2021.11.25 |
댓글