
문제 해석
- 해시 문제임
- 원래는 시간 초과를 대비하기위해서 map 이나 set 을 사용해야되는데
- 요구하는 가지수가 적어서 그냥 우선 sort 으로 돌려보자 하고 돌려봤다.
- 장르별 sort / play수 sort 식으로 작동하면 풀리는 문제임
나의 풀이
function solution(genres, plays) {
// 장르 설정
// 노래 선정
// 고유번호 판단
// 장르를 판단하기 위해 처음에는 object 형식으로 장르를 판단하자
//
let genr_obj={}
for(var i=0; i<genres.length; i++){
if(!genr_obj[genres[i]]) genr_obj[genres[i]]=[plays[i],[plays[i],i]]
else{
// 있는 경우라면 , plays 을 더하자
genr_obj[genres[i]][0]+=plays[i]
genr_obj[genres[i]].push([plays[i],i])
}
}
const genr_to_obj_arr= Object.values(genr_obj);
genr_to_obj_arr.sort((a,b)=>b[0]-a[0]);
let answer=[];
for(var i=0; i<genr_to_obj_arr.length; i++){
genr_to_obj_arr[i].shift()
genr_to_obj_arr[i].sort((a,b)=> b[0]-a[0]);
// 한다음에
// 최대 2개까지니까
for(var ii=0; ii<2; ii++){
if( genr_to_obj_arr[i][ii]){
answer.push(genr_to_obj_arr[i][ii][1])
}
}
}
return (answer)
}
남의 코드
function solution(genres, plays) {
const genreCountMap = new Map();
const albumsWithIndex = genres.map((genre, idx) => ({
genre,
playCount: plays[idx],
idx,
}));
albumsWithIndex.forEach(({ genre, playCount }) => {
genreCountMap.set(genre, (genreCountMap.get(genre) || 0) + playCount);
});
const sortedAlbums = albumsWithIndex.sort((a, b) => {
if (a.genre !== b.genre)
return genreCountMap.get(b.genre) - genreCountMap.get(a.genre);
if (a.playCount !== b.playCount) return b.playCount - a.playCount;
return a.idx - b.idx;
});
const selectedAlbums = new Map();
const answer = [];
sortedAlbums.forEach(({ genre, idx }) => {
const albumCount = selectedAlbums.get(genre) || 0;
if (albumCount < 2) {
selectedAlbums.set(genre, albumCount + 1);
answer.push(idx);
}
});
return answer;
}