functionsolution(genres, plays) { const answer = []; const obj = {}; genres.forEach((genre, i) => { if (!obj[genre]) return (obj[genre] = [plays[i], [[plays[i], i]]]); // 장르별 스트리밍 횟수는 계속 더해줌 obj[genre][0] += plays[i]; // 1.현재 기준 장르별 리스트에서 가장 스트리밍 횟수가 높은 곡과 비교 if (obj[genre][1][0][0] < plays[i]) { // 만약 현재 2위곡이 있다면, 원래 1위가 2위가 되어야 하기 때문에 원래 2위는 제거 if (obj[genre][1][1] !== undefined) obj[genre][1].pop(); // 제일 앞에 있던 곡이 현재 곡에 밀린 것이기 때문에 원래 앞에 놈을 맨 뒤로 보냄 obj[genre][1].push(obj[genre][1][0]); // 그리고 새로 들어온 곡을 0번째에 넣어줌 (unshift를 사용해도 되지만 시간복잡도를 고려했음) obj[genre][1][0] = [plays[i], i]; return; } // 2.위 기준 미충족 -> 제일 많이 들은 곡과 동률일 때, 또는 현재 장르 내 2위보다 현재 곡 스트리밍 횟수가 더 클 경우 if ( obj[genre][1][0][0] === plays[i] || (obj[genre][1][1] !== undefined && obj[genre][1][1][0] < plays[i]) ) { // 원래 2위였던 곡 Out obj[genre][1].pop(); // 현재 곡을 2위로! (같을 경우는 인덱스가 작은 것이 더 우선순위로 와야되기 때문에 선형적 순회 방식을 따르는 현재로썬 그냥 뒤로 보내주는 것이 맞음) obj[genre][1].push([plays[i], i]); return; } // 2위 곡이 계속 비어있으면 안되기 때문에 우선은 아래와 같이 2번 자리는 계속 채워줌 if (obj[genre][1][1] === undefined) obj[genre][1].push([plays[i], i]); }); // 장르별 정렬 const genreList = Object.keys(obj).sort((a, b) => obj[b][0] - obj[a][0]); // 장르 순으로 각 장르별 베스트2 음악들을 answer에 push genreList.forEach((genre) => { obj[genre][1].forEach((li) => answer.push(li[1])); }); return answer; }