Challenge
3-3 Challenge
kagan-draca
2024. 8. 27. 16:27
let makeAlbum = (genres, plays) => {
let order = new Map();
// 중복 없이 장르 별
// 전체 실행 횟수, 곡 넘버, 곡 별 실행 횟수를
// 저장하기 위해 사용
genres.forEach((element, index) => {
if (!order.has(element)) order.set(element, { totalPlay: 0, music: [] });
// 현재 장르가 order에 저장 돼 있지 않으면 저장할 공간 생성
// key를 element(장르)로 저장하고
// {totalPlay : 0, music : []}를 value로
// totalPlay을 key, 전체실행횟수를 value로 사용한다.
// music을 key, 각각의 노래 정보를 담을 배열을 value로 사용한다.
order.get(element).totalPl += plays[index];
// 전체 실행 횟수를 저장한다.
order.get(element).music.push({ numbers: index, plays: plays[index] });
// 각각의 노래에를 music key로 호출된 배열에
// numbers를 key, 각각의 노래 넘버를 value로 저장한다.
// plays를 key, 각각의 노래 재생 횟수를 value로 저장한다.
});
order = [...order.entries()].sort((a, b) => b[1].totalPlay - a[1].totalPlay);
// order.entries()로 key와 value를 배열로 묶은 객체를 반환한다.
// ... spread 연산자로 객체를 풀어
// key와 value를 묶은 배열을 가져온다.
// b[0] : key, b[1] : value
// b[1]로 value(현재 객체)에서 totalPlay
// key에 따른 value를 가져와 비교한다.
// -이면 앞으로 이동, + 이면 뒤로 이동, 0이면 그대로
let result = [];
// 결과를 담을 배열
order.forEach(([genres, { music }]) => {
// element를 이런식으로 풀어서
// 객체의 key와 value(현재는 객체)를 가져올 수 있었다.
// value(객체) 안에 music key만 가져온다.
music.sort((a, b) => b.plays - a.plays || a.numbers - b.numbers);
// sort로 music key안에 있는 두 요소를 가져온다
// plays key로 두 요소의 실행 횟수를 비교한다.
// - 앞으로 이동, + 뒤로 이동,
// 이때 0 : 즉, false 이면
// || 으로 뒤에 있는 내용이 실행되게 한다.
// numbers로 노래 번호를 비교해
// - 앞으로 이동, + 뒤로 이동, 0 그대로 이동시킨다.
result.push(music[0].numbers);
// 장르에서 가장 앞에 있는 노래를 저장한다.
if (music[1]) result.push(music[1].numbers);
// if(music[1])로 0 : False, 0이외 : True
// 로 2번 째 노래가 있으면 저장한다.
});
return result;
};
genres = ["classic", "pop", "classic", "classic", "pop"];
plays = [500, 600, 150, 800, 2500];
console.log(makeAlbum(genres, plays));
처음에 위와 같은 코드가 아닌
다른 코드로 비효율적으로 단계 별로 함수를 만들어
문제를 풀었다.
하지만, 팀원의 코드가 더 수행시간이 짧고 깨끗해서 코드를 뜯어보고
안 보고 따라 만들어봤다.