[Code Kata] Week 2 - Day 4

오지수·2021년 7월 1일
0

CodeKata

목록 보기
7/7
post-thumbnail

문제

nums는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.

nums = [1,1,1,2,2,3],
k = 2

return [1,2]

nums = [1]
k = 1

return [1]

Code

  • 저번 코드 카타 문제 중에서 과반수가 넘는 숫자를 반환하는 문제가 있었는데 객체를 이용하여 푼 기억이 났다.
  • 이번 문제도 객체 안에 받은 인자 배열에 있는 숫자를 키로 하고 이 숫자가 몇 개가 나왔는지 value로 저장한 다음에 정렬을 하면 될 것 같아서 이대로 진행해보았다.
const frequentNum = {};
for (let i in nums) {
    frequentNum[nums[i]] = (frequentNum[nums[i]] || 0) + 1;
  }

const numvalues = Object.values(numObj).map(el => el).sort((a, b) => b - a);
  const kValues = numvalues.slice(0, k);

여기서 살짝 문제가 생겼다.
value를 따로 배열로 만들어서 정렬할 경우 이 값에 맞는 키 값을 출력하도록 로직을 짜야 하는데 이것이 너무 번거롭다고 느껴졌다.

그래서 객체의 안에 있는 키와 value를 같이 배열에 저장하여 한꺼번에 정렬하도록 하여 키를 출력하도록 코드 로직을 변경하였다.

function topK(nums, k) {
  const frequentNum = {};
  const result = [];
  
  for (let i in nums) {
    frequentNum[nums[i]] = (frequentNum[nums[i]] || 0) + 1;
  }

  const entries = Object.entries(frequentNum);
  
  const sortEntries = entries.sort((a,b) => {
    return b[1] - a[1];
  })

  for (let i in sortEntries) {
    sortEntries.length = k;
    result.push(parseInt(sortEntries[i][0]));
  }

  
  return result;
}

entries()는 객체 안에 있는 키와 value를 배열로 저장하는 함수이다. 이 함수를 이용해서 키와 값이 들어있는 배열을 생성하고 통째로 내림차순 해주었다.

그리고 새 배열에다가 길이 k만큼 push 해주었더니 결과가 나왔다!

profile
My Moto:: 내 스스로와 더불어 주변에게도 좋은 영향을 행사하도록 점검 & 노력..!!

0개의 댓글