💡
nums
는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.[Example] cosnt nums = [1,1,1,2,2,3], k = 2 return [1,2] nums = [1] k = 1 return [1]
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에 나온 기능으로 객체를 배열로 바꾸어주어 코드의 길이는 줄일 수 있었다.