[Javascript] 프로그래머스 해시:베스트앨범

이두팔·2021년 1월 12일
1

프로그래머스

목록 보기
5/9

처음에 세상 어렵게 풀고 20점인가 맞아서 옹잉..? 했는뎅

function solution(genres, plays) {
  let arr = [];
  let output = {};
  let obj = {};
  let answer = [];

  for (let i in genres) {
    arr.push([i, genres[i], plays[i]])
    obj[genres[i]] = 0;
    output[genres[i]] = [];
  }

  arr.forEach(v => {
    obj[v[1]] += v[2];
  })

  arr.sort((a, b) => {
    if (a[1] === b[1]) {
      return a[2] < b[2] ? 1 : (a[2] > b[2]) ? -1 : 0;
    } else {
      return a[2] < b[2] ? 1 : -1;
    }
  })

  obj = Object.entries(obj).sort((a, b) => b[1] - a[1]).map(v => v[0])

  let currentKey = arr[0][1];
  let index = 0;
  arr.forEach((v, index) => {
    if (v[1] === currentKey && index < 2) {
      output[v[1]].push(v[0]);
      index++;
    } else if (v[1] !== currentKey) {
      currentKey = v[1];
      output[v[1]].push(v[0])
    }
  })

  obj.forEach((v) => {
    if (Object.keys(output).find((key) => v === key)) {
      answer.push(output[v].map(v => parseInt(v)))
    }
  })

  return answer.flat();
}

에궁 다시봐도 이게 몬가 싶당

주석도 안적었당

그래서 다른 분 코드를 보니깐 요런식으로 되어있었당 reduce를 활용해서 다시 풀었당

function solution(genres, plays) {
    const genresList = genres.reduce((acc, cur, index) => {
      if (!acc[cur]) {
        acc[cur] = {
          total: 0,
          list: [],
        };
      }

      // total로 비교해야하기 때문에 값을 저장
      acc[cur].total += plays[index];
      // index를 결과값으로 쓰기 때문에 index와 값을 함께 저장
      acc[cur].list.push([index, plays[index]]);

      return acc;
    }, {});

    const sortGenresList = Object.values(genresList).sort(
      (a, b) => {
        // 먼저 total 내림차순으로 정렬
        return b.total - a.total;
      },
    );

    // 정렬한 total을 사용한다.
    const answer = sortGenresList.reduce((acc, genre) => {
      // list의 값을 가지고 우선 비교하고
      genre.list.sort((a, b) => {
        return b[1] - a[1];
      });

      // 각 항목의 첫번째(제일 큰 값) 값을 넣어준다.
      acc.push(genre.list[0][0]);

      // 리스트가 여러개일 경우 그 다음 값을 넣어준다.
      if (genre.list.length > 1) {
        acc.push(genre.list[1][0]);
      }

      return acc;
    }, []);

    return answer;
  }

이렇게 통과!

profile
Software Engineer

0개의 댓글