[프로그래머스] 베스트앨범 / JavaScript / Level 3

KimYoungWoong·2022년 12월 11일
0

Programmers

목록 보기
38/60
post-thumbnail

🚩 문제 주소


📄 풀이

해시, 정렬

genres.forEach((v, i) => {
    if (album.has(v)) {
      let temp = album.get(v);
      temp[0] += plays[i];
      temp.push([i, plays[i]]);
      album.set(v, temp);
    } else {
      album.set(v, [plays[i], [i, plays[i]]]);
    }
  });

'classic' => [ 1450, [ 0, 500 ], [ 2, 150 ], [ 3, 800 ] ]
위와 같이 [재생 시간의 총 합, [고유 번호, 각 재생 시간], ... ]로 Map을 만들어 줍니다.

 const album_list = [...album];
 album_list.sort((a, b) => b[1][0] - a[1][0]);
 album_list.forEach((v) => v[1].sort((a, b) => b[1] - a[1]));

Map을 배열로 변환 → 배열을 재생 시간의 총 합으로 내림차순 정렬 → 장르 내부의 각 고유 번호의 노래 재생시간 내림차순 정렬을 해줍니다.

album = new Map(album_list);

정렬한 배열을 다시 Map으로 바꿉니다.

 album.forEach((v) => v.shift());
 album.forEach((v) => {
   v.forEach((v2, i) => {
     if (i < 2) answer.push(v2[0]);
   });
 });

총 재생시간을 제거해주고, 앞에서부터 2개의 고유 번호를 정답 배열에 저장해줍니다.



👨‍💻 코드

function solution(genres, plays) {
  const answer = [];
  let album = new Map();

  genres.forEach((v, i) => {
    if (album.has(v)) {
      let temp = album.get(v);
      temp[0] += plays[i];
      temp.push([i, plays[i]]);
      album.set(v, temp);
    } else {
      album.set(v, [plays[i], [i, plays[i]]]);
    }
  });

  const album_list = [...album];
  album_list.sort((a, b) => b[1][0] - a[1][0]);
  album_list.forEach((v) => v[1].sort((a, b) => b[1] - a[1]));

  album = new Map(album_list);

  album.forEach((v) => v.shift());
  album.forEach((v) => {
    v.forEach((v2, i) => {
      if (i < 2) answer.push(v2[0]);
    });
  });

  return answer;
}

profile
블로그 이전했습니다!! https://highero.tistory.com

0개의 댓글