문제
- 입력값
- 특정 노래 장르인 genres[]와 특정 노래 재생 횟수인 plays[]가 주어진다.
- 전체 노래 재생 횟수가 많은 장르부터 수록한다.
- 특정 장르 내에서 재생 횟수가 많은 순으로 정렬한다.
- 만약 특정 장르 내에서 재생 횟수가 같다면 고유 번호가 낮은 노래부터 수록한다.
위 방식대로 수록했을 때 노래의 고유 번호를 반환하라일단 반쯤 풀었는데 코드랑 설명 다 날아갔고 오늘 컨디션이 너무 안좋아서 못풀고 코드 분석만 진행했다.
내일 다시 풀어보겠다.코드풀이
- 실패 - 다른 사람 코드 참조
- 카테고리별 총 재생 횟수를 num에 저장하고 특정 카테고리 노래 인덱스 및 재생 횟수를 music에 저장한다.
- num을 내림차순 정렬한다.
- music에서 재생 횟수를 기준으로 내림차순 정렬한다.
- num에 정렬된 카테고리 순서대로 music의 노래 인덱스를 앞에서부터 2개 가져와 ArrayList인 answer에 저장한다.
- answer를 int[] 형태로 변환 후 반환한다.
import java.util.*;
class Solution {
public int\[\] solution(String\[\] genres, int\[\] plays) {
ArrayList answer = new ArrayList<>();
HashMap<String, Integer> num = new HashMap<>(); // 카테고리별 총 재생횟수
HashMap<String, HashMap<Integer, Integer>> music = new HashMap<>(); // 특정 카테고리 노래 인덱스 및 재생횟수
// 카테고리별 총 재생횟수 저장(num)
// 특정 카테고리 노래 인덱스, 재생 횟수 저장(music)
for(int i = 0; i < plays.length; i++) {
if(!num.containsKey(genres[i])) {
HashMap<Integer, Integer> map = new HashMap<>();
map.put(i, plays[i]);
music.put(genres[i], map);
num.put(genres[i], plays[i]);
} else {
music.get(genres[i]).put(i, plays[i]);
num.put(genres[i], num.get(genres[i]) + plays[i]);
}
}
// 카테고리별 총 재생횟수 내림차순 정렬
List<String> keySet = new ArrayList(num.keySet());
Collections.sort(keySet, (s1, s2) -> num.get(s2) - (num.get(s1)));
// 특정 카테고리의 노래들 재생 횟수 기준 내림차순 정렬
for(String key : keySet) {
HashMap<Integer, Integer> map = music.get(key);
List<Integer> genre_key = new ArrayList(map.keySet());
Collections.sort(genre_key, (s1, s2) -> map.get(s2) - (map.get(s1)));
// 특정 카테고리의 노래 앞에서부터 2개 answer 배열에 저장
answer.add(genre_key.get(0));
if(genre_key.size() > 1)
answer.add(genre_key.get(1));
}
return answer.stream().mapToInt(i -> i).toArray();
}
추가로 학습해야할 것
Collections
'코딩 테스트 > 자료구조' 카테고리의 다른 글
[프로그래머스] 디스크 컨트롤러(Lv3) - 힙(Heap) (0) | 2024.06.26 |
---|---|
[프로그래머스] 더 맵게(Lv2) - 힙(Heap) (0) | 2024.06.25 |
[프로그래머스] 테이블 해시 함수 (0) | 2024.06.24 |
[프로그래머스] 전화번호 목록 - HashSet (0) | 2024.06.23 |
[프로그래머스] 완주하지 못한 선수 - HashMap, HashSet (0) | 2024.06.22 |