처음에 세상 어렵게 풀고 20점인가 맞아서 옹잉..? 했는뎅
function solution(genres, plays) {
let arr = [];
let output = {};
let obj = {};
let answer = [];
for (let i in genres) {
arr.push([i, genres[i], plays[i]])
obj[genres[i]] = 0;
output[genres[i]] = [];
}
arr.forEach(v => {
obj[v[1]] += v[2];
})
arr.sort((a, b) => {
if (a[1] === b[1]) {
return a[2] < b[2] ? 1 : (a[2] > b[2]) ? -1 : 0;
} else {
return a[2] < b[2] ? 1 : -1;
}
})
obj = Object.entries(obj).sort((a, b) => b[1] - a[1]).map(v => v[0])
let currentKey = arr[0][1];
let index = 0;
arr.forEach((v, index) => {
if (v[1] === currentKey && index < 2) {
output[v[1]].push(v[0]);
index++;
} else if (v[1] !== currentKey) {
currentKey = v[1];
output[v[1]].push(v[0])
}
})
obj.forEach((v) => {
if (Object.keys(output).find((key) => v === key)) {
answer.push(output[v].map(v => parseInt(v)))
}
})
return answer.flat();
}
에궁 다시봐도 이게 몬가 싶당
주석도 안적었당
그래서 다른 분 코드를 보니깐 요런식으로 되어있었당 reduce를 활용해서 다시 풀었당
function solution(genres, plays) {
const genresList = genres.reduce((acc, cur, index) => {
if (!acc[cur]) {
acc[cur] = {
total: 0,
list: [],
};
}
// total로 비교해야하기 때문에 값을 저장
acc[cur].total += plays[index];
// index를 결과값으로 쓰기 때문에 index와 값을 함께 저장
acc[cur].list.push([index, plays[index]]);
return acc;
}, {});
const sortGenresList = Object.values(genresList).sort(
(a, b) => {
// 먼저 total 내림차순으로 정렬
return b.total - a.total;
},
);
// 정렬한 total을 사용한다.
const answer = sortGenresList.reduce((acc, genre) => {
// list의 값을 가지고 우선 비교하고
genre.list.sort((a, b) => {
return b[1] - a[1];
});
// 각 항목의 첫번째(제일 큰 값) 값을 넣어준다.
acc.push(genre.list[0][0]);
// 리스트가 여러개일 경우 그 다음 값을 넣어준다.
if (genre.list.length > 1) {
acc.push(genre.list[1][0]);
}
return acc;
}, []);
return answer;
}
이렇게 통과!