Mini
[틀림] 프로그래머스 베스트 앨범 // 해시맵, 구현, 스트림, 리스트 정렬 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 풀이
m1 <장르, List<재생횟수, index>>
m2 <장르, 총 재생횟수>
맵 2개를 만든다.

m2를 정렬하고 그 키값에 대해 정렬된순서로 순회하면서
m1을 꺼낸다.
m1을 정렬한다. (재생횟수기준 내림차순)
2개를 뽑고 정답에 추가한다.

* 전체코드
import java.util.*;
class pair{
int idx, cnt;
pair(int idx, int cnt){
this.idx=idx;
this.cnt=cnt;
}
public String toString(){
return this.idx+" "+this.cnt;
}
}
class Solution {
public int[] solution(String[] genres, int[] plays) {
ArrayList<Integer> ret = new ArrayList<>();
HashMap<String,ArrayList<pair>> m1 = new HashMap<>(); //<장르, 곡정보들(cnt,index>)
HashMap<String,Integer> m2 = new HashMap<>(); // <장르, 재생횟수>
int n = genres.length;
for(int i=0;i<n;++i){
//최초 삽입인경우 초기화, 값 삽입은 아래서 진행!
if(!m1.containsKey(genres[i])){
ArrayList<pair> tmp = new ArrayList<>();
// tmp.add(new pair(plays[i],i));
m1.put(genres[i],tmp);
m2.put(genres[i],0);
}
var tmp = m1.get(genres[i]);
tmp.add(new pair(i,plays[i]));
m1.put(genres[i],tmp);
m2.put(genres[i],m2.get(genres[i])+plays[i]);
}
// System.out.println(m1);
// System.out.println(m2);
//<장르, 재생횟수를 내림차순 정렬>
var sortedGen = m2.entrySet().stream()
.sorted((a,b)-> Integer.compare(b.getValue(), a.getValue()));
// 정렬된 <장르, 재생횟수> 순회하면서
sortedGen.forEach(e -> {
// 내부 리스트에서 cnt기준 내림차순정렬, 2개 가져오기
var sortedSong = m1.get(e.getKey()).stream()
.sorted((a,b)->Integer.compare(b.cnt,a.cnt))
.limit(2);
// 가져온것의 index를 정답에 추가
sortedSong.forEach(song -> ret.add(song.idx));
});
return ret.stream().mapToInt(Integer::intValue).toArray();
}
}'Algorithm > 해시' 카테고리의 다른 글
| 리트코드 투썸 c++ // pair 이분탐색 방법 , 해쉬맵, nC2 O(n) 구현방법 (0) | 2024.05.18 |
|---|---|
| 프로그래머스 베스트앨범 c++ // 벡터에 여러타입 넣는방법 (0) | 2023.11.01 |