[프로그래머스 Lv3] 베스트앨범(JavaScript)

loopydoopy·2024년 1월 17일
0

알고리즘

목록 보기
13/14

문제


코드

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

재생 횟수 기준 상위 2개의 노래를 뽑기

genreSum, table에 대해 이미 정렬을 해주었기 때문에 최종적으로 genreSum을 순회하며 현재 key(i)와 table의 genre와 같다면 해당 인덱스와 그 다음 인덱스(i+1)에 해당하는 객체의 idx(노래 고유 번호)를 answer에 push 했다.


장르에 해당하는 노래가 한 개 뿐인 경우

조건 4) 즉, 현재 장르에 해당하는 노래가 한 개 뿐인 경우를 고려하여, 다음 인덱스에 해당하는 genre가 현재 인덱스에 해당하는 장르와 같은지 판단해주는 조건문이 필요하다.

추가로, table의 마지막 요소 해당하는 장르가 노래를 하나만 가지고 있는 경우를 고려하여 (index+1 < table.length) && 조건을 추가해주었다.
(추가하지 않으면 런타임 에러 발생)



모두 통과!

profile
일단 해보기🐢

0개의 댓글