Code Kata #7 topK

kich555·2021년 10월 10일
0

Code Kata

목록 보기
7/7

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

[Example]

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

return [1,2]

nums = [1]
k = 1

return [1]

💻Top K


function topK(nums, k) {
const arr = [];
const arr2 = [];

const list = nums.reduce((t, a) => {
  t[a] = (t[a] || 0) + 1
  return t
}, {}); // reduce 메소드를 사용해서 요소의 중복횟수를 담은 객체를 생성

for(i in list) {
  arr.push([i, list[i]])
}; // k만큼의 반복문을 돌려야 하기 때문에 객체 list를 배열화 하여 빈 배열 arr에 push함

arr.sort(function(a,b) {
  return b[1] - a[1]
}); // 중복값이 많은 수를 k 만큼 반환해야 하기 때문에 sort를 사용하여 배열을 중복횟수가 많은 수 순서대로 정렬

for(j=0; j<k; j++){
  arr2.push(arr[j][0]*1) // 
}; // 빈 배열 arr2에 k만큼 중복이 많은 수를 담음
  

return arr2
}

풀고나서도 썩 만족스럽진 않았던 문제...
요소 별 중복 횟수를 가지는 객체를 생성하여 다시 배열로 돌리고 다른 배열을 만들고....좀 복잡했다.

const list = nums.reduce((t, a) => {
  t[a] = (t[a] || 0) + 1
  return t
}, {});

reduce()메소드를 사용하여 배열을
{'1' = n, '2' = n, '3' = n, ...}
형태의 객체로 만들었다.
(n = 중복횟수)

for(i in list) {
  arr.push([i, list[i]])
};

이후 반복문을 사용해야 했기에 생성한 list객체의 요소를 [ '1', n ]형태로 변환하여 빈 배열 arr에 push하였다. [ [ '1', n ], [ '2', n ], [ '3', n ]....]

arr.sort(function(a,b) {
  return b[1] - a[1]
});

sort를 사용하여 배열을 중복횟수가 많은 순서대로 정렬하고,

for(j=0; j<k; j++){
  arr2.push(arr[j][0]*1) // 
};

인자로 받은 k 만큼 반복문을 돌려 arr2에 담았다.

배열을 객체로, 다시 배열로, 그리고 다시 배열로..

매우 마음에 들지 않으니 리팩토링을 진행해보자.

💻리팩토링

function topK(nums, k) {
  
  const list = nums.reduce((t, a) => {
    t[a] = (t[a] || 0) + 1
    return t
  },{})

  const newList = Object.entries(list).sort(([,a],[,b]) => b-a)
  
  for(j=0; j<k; j++){
  arr2.push(arr[j][0]*1) // 
};
  
}

위와 같은 개념이지만 Object.entries 를 사용해 보았다.
ES8에 나온 기능으로 객체를 배열로 바꾸어주어 코드의 길이는 줄일 수 있었다.

profile
const isInChallenge = true; const hasStrongWill = true; (() => { while (isInChallenge) { if(hasStrongWill) {return 'Success' } })();

0개의 댓글