Lv3. 베스트앨범 Javascript
https://programmers.co.kr/learn/courses/30/lessons/42579
function solution(gs, ps) {
const list = {}
const answer = []
const l = gs.length
for (let i = 0; i < l; i++) {
const g = gs[i]
const item = { i, p: ps[i] }
list[g] = (list[g] || []).concat(item)
}
for (const key in list) {
list[key].sort((a, b) => {
if (b.p > a.p) return 1
if (b.p < a.p) return -1
if (b.p = a.p) {
return a.i - b.i
}
})
}
const uniq = Array.from(new Set(gs))
uniq.sort((a, b) => {
const sumB = list[b].reduce((acc, cur) => acc + cur.p, 0)
const sumA = list[a].reduce((acc, cur) => acc + cur.p, 0)
return sumB - sumA
})
uniq.forEach(item => {
answer.push(list[item][0].i)
if (list[item][1]) answer.push(list[item][1].i)
})
return answer
}
// test code
// 장르에 hell을 추가함 (play 2000)
const gs = ["classic", "pop", "classic", "classic", "pop", "hell", "classic"]
const ps = [500, 600, 150, 800, 2500, 2000, 150]
function solution(gs, ps) {
const list = {} // 객체 선언
const answer = []
const l = gs.length
// grouping
for (let i = 0; i < l; i++) {
const g = gs[i]
const item = { i, p: ps[i] }
list[g] = (list[g] || []).concat(item)
}
// classic: Array(4)
// 0: {i: 3, p: 800}
// 1: {i: 0, p: 500}
// 2: {i: 2, p: 150}
// 3: {i: 6, p: 150}
// hell: Array(1)
// 0: {i: 5, p: 2000}
// pop: Array(2)
// 0: {i: 4, p: 2500}
// 1: {i: 1, p: 600}
// sort item in group
// 위에서 그룹화를 했으니, 내부의 아이템을 정렬함
// 조건1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
// 조건2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
// 조건3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
// orderBy plays DESC, index ASC
// 즉, 재생 수 기준으로 내림차순 => 재생 수가 같을 시 고유 번호 오름차순
for (const key in list) {
list[key].sort((a, b) => {
if (b.p > a.p) return 1
if (b.p < a.p) return -1
if (b.p = a.p) {
return a.i - b.i
}
})
}
// sort group
// 위에서 그룹 내부의 아이템을 정렬했으니, 이번에는 그룹 자체를 정렬함
const uniq = Array.from(new Set(gs)) // set 활용을 통한 중복 제거
uniq.sort((a, b) => {
// reduce를 통해 각 장르 아이템들의 재생 수를 모두 합함 => 매번 계산하기 때문에 효율이 낮을 듯.
const sumB = list[b].reduce((acc, cur) => acc + cur.p, 0)
const sumA = list[a].reduce((acc, cur) => acc + cur.p, 0)
return sumB - sumA // 내림차순 정렬
})
// 정렬된 uniq를 돌면서 첫번째 노래를 answer에 넣고
// 두번째 노래가 없을 수도 있으므로 if로 분기를 태워서, 있을 때만 push
uniq.forEach(item => {
answer.push(list[item][0].i)
if (list[item][1]) answer.push(list[item][1].i)
})
return answer
}
댓글 환영
질문 환영
by.protect-me