[프로그래머스] 베스트 앨범 (자바스크립트, JavaScript)

시작하며 😂

간만에 친구를 만나고, 술 마시고 오느라 졸리네오....
일단 제가 밀린 공부들이 있으니, 이를 해야 하는 것도 맞아서, 오늘도 새벽 코딩 중입니다.
이 예제는 제가 아주 자바스크립트 입문 일주일 때쯤 봤던 문제였어요. 그때는 해시이니 뭐니 아무것도 몰랐는데, 이런 게 해시군요!

간만에 보니 기분이 묘했는데, 옛날보다 좀 더 구조를 짜면서 하니, 그때보다 훨씬 시간도 단축돼서 당연한 거지만 기분은 좋네요. 그럼 시작해보겠습니다 🌈

풀이과정 📃

이 문제를 오랜만에 봤을 때 제 풀이과정은 다음과 같았어요.

  1. 핵심은 결국 제한사항에 들어있다. 이를 만족하면 된다.
    • 가. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
    • 나. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
    • 다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
  2. 인덱스를 지정하고, 관리하면 좀 더 편할 것 같다. 해시테이블을 적극적으로 사용하자!
  3. 만약 해시테이블을 사용한다면 내부에 인덱스를 만들어놔야 편할 것이다. 안 그렇다면 전체 genres를 탐색하면서 O(n)이 걸릴 것이기 때문이다. 따라서 인덱스와 전체 횟수를 따로 객체 형태로 관리해준다.
  4. 나중에 정렬을 통해 각 장르들의 순위를 관리하고, 그 안에서 앨범들의 순위를 또 관리해서 최대 2개씩 출력한다. 이때, slice 배열 메소드의 특성을 적극적으로 활용하자!

코드

const solution = (genres, plays) => {
   let answer = [];
   /* 
       genreObj = { 
           key: { // 장르
               indicies: <Array>, // index를 담아놓는 배열
               playCount: <number> // 현재 장르가 실행된 총 횟수
           }
       }
   */
   const genreObj = {};
   genres.forEach((genre, index) => {
       genreObj[genre] = genreObj[genre] ? {
           indicies: [ ...genreObj[genre]["indicies"], index ],
           playCount: genreObj[genre]["playCount"] + plays[index]
       } : {
           indicies: [ index ],
           playCount: plays[index]
       }
   })
   const GenresRankArr = Object.values(genreObj).sort((a, b) => b["playCount"] - a["playCount"]);
   GenresRankArr.forEach(({ indicies }) => {
       indicies.sort((a, b) => (plays[b] !== plays[a]) ? (plays[b] - plays[a]) : (a - b));
       answer = [ ...answer, ...indicies.slice(0, 2) ]
   })
   return answer;
}

맞았어오!!!

마치며 😨

다시 보니, 코드는 여전히 엉망이네요.
띄어쓰기가 전혀 돼있지 않는 것과, key같은 경우도 어떤 때는 .key을 이용해서 했는데 어떤 때는 또 [key] 형태로 썼었어요. (지금은 수정한 상태)

여전히 깔끔한 코드를 작성하기에는 반성해야할 것 같아요. 이상!

좋은 웹페이지 즐겨찾기