For Programmer

프로그래머스 베스트앨범 자바스크립트 문제풀이(javascript) 본문

코팅테스트/프로그래머스 문제 모음

프로그래머스 베스트앨범 자바스크립트 문제풀이(javascript)

유지광이 2022. 5. 30. 23:08
728x90

https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 


문제에서 요구한 대로 해시와 정렬만 잘하면 쉽게 풀 수 있는 문제이다. 설명은 주석으로 달아놨다.

 

function solution(genres, plays) {
  
  const gernes_hash = {} //장르별 최대 플레이 횟수를 저장할 해시
  const gernes_cnt = {} // 장르별 각각의 플레이 횟수를 리스트로 저장할 해시

  for (let i = 0 ; i < genres.length ; i++){
    if (gernes_hash[genres[i]]){
      gernes_hash[genres[i]] += plays[i] //각 장르별 플레이 횟수를 계속 더해준다.
      gernes_cnt[genres[i]].push([plays[i],i]) //각 장르별 각각의 플레이 횟수를 리스트에 넣는다.
    } else {
      gernes_hash[genres[i]] = plays[i] //각 장르별 플레이 횟수를 더해준다.
      gernes_cnt[genres[i]] = [[plays[i],i]]  //각 장르별 각각의 플레이 횟수를 리스트로 만든다.
    }
  }

   //각 장르별 최대 횟수를 구하기위해 해쉬값에 있는 key,value 를 배열에 넣어준다.
  const gernes_array = []
  for (let i in gernes_hash){
    gernes_array.push([i,gernes_hash[i]])
  }
  //장르 전체 횟수 정렬
  gernes_array.sort((a,b) => {
    return b[1] - a[1]
  })

  // 장르별 각각의 플레이 횟수를 정렬
  for (let i in gernes_cnt){
    gernes_cnt[i].sort((a,b) => {
      if (b[0] > a[0])
        return 1
      else if (b[0] < a[0]) 
        return -1
      else {
        if (b[1] < a[1])
        return 1
      else if (b[1] > a[1]) 
        return -1
      }
    })
  }
  //정답리스트에 각 장르마다 상위 앨범 2개를 넣어준다. 
  const answer = []
  for (let i = 0 ; i < gernes_array.length ; i++){
    for (let j = 0 ; j < gernes_cnt[gernes_array[i][0]].length ; j++){
      if (j === 2)
        break
      answer.push(gernes_cnt[gernes_array[i][0]][j][1])
    }
  }
  return answer
}
728x90
Comments