function solution(genres, plays) {
let answer = []
let genreSum = {}
let table = []
for(let i = 0 ; i < genres.length ; i++) {
let temp = {genre: genres[i], idx: i, playCnt: plays[i]}
table.push(temp)
genreSum[genres[i]] = genreSum[genres[i]] ? + genreSum[genres[i]]+plays[i] : plays[i]
}
genreSum = Object.fromEntries(
Object.entries(genreSum).sort(([,a], [,b]) => a>b ? -1:1)
)
table.sort((a,b)=> a.playCnt - b.playCnt || b.idx - a.idx)
table.sort((a,b) => a.genre > b.genre ? 1 : -1)
for(let i in genreSum) {
let index = table.findIndex(v => v.genre === i)
answer.push(table[index].idx)
if((index+1 < table.length) && table[index+1].genre === i) {
answer.push(table[index+1].idx)
}
}
return answer
}
어떤 방식으로 풀어야할 지 오래 고민한 문제는 아니지만 주어진 조건을 빠짐없이 고려하고, 상황에 맞게 객체에 접근+수정하는 과정에서 console.log를 여러번 출력해보며 풀었다.
1) 총 재생 횟수가 많은 장르부터 수록
2) 같은 장르 내에서 재생 횟수가 많은 노래부터 수록
3) 같은 장르 내에서 재생 횟수가 같으면 고유 번호가 낮은 노래부터 수록
4) 장르에 속한 곡이 하나라면, 하나의 곡만 선택
우선 for문을 순회하며 table 배열에는 문제에서 주어진 genres
, plays
에 맞게 각 노래를 장르
, 고유 번호
, 재생 횟수
를 key로 가지는 객체를 배열에 모두 담은 후, 조건 2), 3)
을 위해 정렬했다.
table.sort((a,b)=> a.playCnt - b.playCnt || b.idx - a.idx)
그리고 genreSum
에는 각 장르별 총 재생 횟수를 담은 후, 이후 조건 1)
을 위해 총 재생 횟수를 기준으로 정렬해주었다.
genreSum = Object.fromEntries(
Object.entries(genreSum).sort(([,a], [,b]) => a>b ? -1:1)
)
// console.log(genreSum) 예시
{ pop: 3100, classic: 2100 }
// console.log(table) 예시
[
{ genre: 'classic', idx: 2, playCnt: 800 },
{ genre: 'classic', idx: 3, playCnt: 800 },
{ genre: 'classic', idx: 0, playCnt: 500 },
{ genre: 'pop', idx: 4, playCnt: 2500 },
{ genre: 'pop', idx: 1, playCnt: 600 }
]
genreSum
, table
에 대해 이미 정렬을 해주었기 때문에 최종적으로 genreSum
을 순회하며 현재 key(i)와 table의 genre
와 같다면 해당 인덱스와 그 다음 인덱스(i+1)에 해당하는 객체의 idx
(노래 고유 번호)를 answer
에 push 했다.
조건 4)
즉, 현재 장르에 해당하는 노래가 한 개 뿐인 경우를 고려하여, 다음 인덱스에 해당하는 genre
가 현재 인덱스에 해당하는 장르와 같은지 판단해주는 조건문이 필요하다.
추가로, table
의 마지막 요소 해당하는 장르가 노래를 하나만 가지고 있는 경우를 고려하여 (index+1 < table.length) &&
조건을 추가해주었다.
(추가하지 않으면 런타임 에러 발생)
모두 통과!