[programmers] Lv3. 베스트앨범 ​Javascript | Hash, Sort | protect-me

protect-me·2021년 8월 12일
0
post-thumbnail

🕊 Link

Lv3. 베스트앨범 Javascript
https://programmers.co.kr/learn/courses/30/lessons/42579

🧑🏻‍💻 Code(javascript)

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
}

💡 Solution


// 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
}

👨🏻‍💻💭 Self Feedback

  • sort .. 활용

  • 2021.08.12 - 최초 작성

댓글 환영 질문 환영
by.protect-me

profile
protect me from what i want

0개의 댓글