개발 블로그

[프로그래머스/Javascript/Hash] 베스트앨범 본문

IT/Programmers

[프로그래머스/Javascript/Hash] 베스트앨범

파티에 2021. 4. 12. 00:27

1. 문제 설명(출처: programmers.co.kr/learn/courses/30/lessons/42579)

2. 문제 풀이
1) 문제에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다 라고 하였으니, 장르별로 구분하기 위해 hash를 사용한다.
2) 모든 장르에 대하여 아래 명령을 반복한다.
   2-1) 만약 hmap에 해당 장르가 이미 있다면
      2-1-T1) 해당 장르의 value를 sum과 list 로 분해한다.
      2-1-T2) 해당 장르를 (genre, [누적 play수 + 해당 play수, [ [다른 노래 play수, 다른 노래 고유번호], .... , [해당 노래 play수, 해당 노래 고유번호] ] ]의 형태로 저장한다.
      2-1-F1) 해당 장르를 (genre, [해당 play수, [ [해당 노래 play수, 해당 노래 고유번호] ] ]의 형태로 저장한다.
3) 모든 장르에 대하여 누적 play 순으로 내림차순 정렬한 뒤, 정렬한 값을 sortedGenreList에 저장한다.
   ex) [ [ 3100, [ [600, 1], [2500, 4] ] ], [ 1450, [ [500, 0], [150, 2], [800, 3] ] ] ]
4) sortedGenreList에 저장된 값을 각 노래의 play 순으로 내림차순 정렬한 뒤, 정렬한 값을 sortedPlaysInfo에 저장한다.
   ex) [ [ [ 2500, 4 ], [ 600, 1 ] ], [ [ 800, 3 ], [ 500, 0 ], [ 150, 2 ] ] ]
5) 답을 저장할 배열 answer를 만든다.
6) 모든 sortedPlaysInfo에 대하여 아래 명령을 반복해서 수행한다.
    6-1) 문제에서 장르별로 두 개씩 모아서 베스트 앨범을 출시한다 라고 하였으니, 각 장르별로 앞에서 2개씩 노래를 꺼내서 two에 저장한다.
    6-2) two에 저장된 각 노래의 고유 번호를 answer에 순서대로 저장한다.
7) answer를 반환한다.

3. 결과 코드

function solution(genres, plays) {
  var hmap = new Map()
  genres.map((genre, i) => {
    if(hmap.has(genre)){
      var [sum, list] = hmap.get(genre)
      hmap.set(genre, [sum + plays[i], list.concat([[plays[i], i]])])
    }else{
      hmap.set(genre, [plays[i], [[plays[i], i]]])
    }
  })

  const sortedGenreList = [...hmap.values()].sort((a, b) => b[0] - a[0])
  const sortedPlaysInfo = sortedGenreList.map((playsInfo) => playsInfo[1].sort((a, b) => b[0] - a[0]))
  
  var answer = []
  for(let playsInfo of sortedPlaysInfo){
    const two = playsInfo.splice(0, 2)
    two.map((t) => answer.push(t[1]))
  }

  return answer;
}