해쉬??
머든지 해쉬(맵)으로 만들어버렷!!!
function solution(genres, plays) {
const result = [];
const mixed = genres
.map((g, i) => [g, plays[i]])
.sort((a, b) => {
if (a[0] === b[0]) return b[1] - a[1];
else {
if (a[0] > b[0]) return 1;
else return -1;
}
});
const playMap = plays.reduce((acc, cur, i) => ({ ...acc, [cur]: i }), {});
const totalArr = Object.entries(
genres.reduce((acc, cur, i) => {
if (acc[cur]) return { ...acc, [cur]: acc[cur] + plays[i] };
else return { ...acc, [cur]: plays[i] };
}, {})
).sort((a, b) => b[1] - a[1]);
console.log(totalArr);
const bestGenres = [totalArr[0][0], totalArr[1][0]];
bestGenres.forEach((bg) => {
let count = 0;
mixed.forEach(([g, p]) => {
if (bg === g && count < 2) {
result.push(playMap[p]);
count++;
}
});
});
return result;
}
그런데 안되네... 20개 테케(테스트 케이스) 중에 1개만 맞음...내 생각엔 이렇게 접근하는게 아닌가보다. 문제를 다시 보고 아예 코드를 다시 작성해야했다.
역시 테케에서 90퍼이상이 틀린다면, 문제를 잘못이해한 것이다. Try1에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시
라는 맨 윗 줄에 써있는 말을 무시하고 구현한셈이다. (나는 가장 많이 들은 재생된 2개의 장르에서 2개의 곡을 뽑으라는 것으로 이해하였다. 즉 완전 내맘대로 해석한 것!! Try1은 그냥 문제와 관계없이 코드 연습한 시간이라고 생각한다...🥲)
function solution(genres, plays) {
const sortedGenres = Object.entries(
genres.reduce((acc, cur, i) => {
if (acc[cur]) return { ...acc, [cur]: acc[cur] + plays[i] };
else return { ...acc, [cur]: plays[i] };
}, {})
)
.sort((a, b) => b[1] - a[1])
.map(([g, p]) => g);
const musics = genres.map((item, i) => ({ g: item, p: plays[i], i }));
let result = [];
sortedGenres.forEach((g) => {
const tmp = musics
.filter((item) => item.g === g)
.sort((a, b) => b.p - a.p)
.slice(0, 2)
.map((item) => item.i);
result = result.concat(tmp);
});
return result;
}
문제를 이해라고 한번에 통과...후후 코드는 뭔가 메소드체이닝이 난잡(?)하게 되어있지만 그럼에도 통과하였다. 약간 설명을 덧붙이자면 아래와 같다.
- sortedGenres : 많이 재생된 장르 순으로 된 배열
- musics : 각 노래들의 정보(장르, 재생 횟수, 고유번호)를 하나의 객체로 모아놓은 배열
- 마지막 forEach 안에서 장르별로 순회하여 장르 내에서 많이 재생된 노래 2곡을 뽑아낸다.
첨언하자면, 다른 풀이들도 나처럼 메소드 체이닝의 향연으로 보이긴하다. 여기서 이와 같은 향연 속에서 코드를 얼마나 가독성 있게 적는냐 + 좀 더 간편하게 체이닝할 수 있는 방법을 없을까를 좀 더 고민하면 좋을거같다.