D.evelop [CS]/Algorithm
[Algorithm 011] JS - topK
Danne
2021. 10. 3. 01:15
Q. nums는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.
nums = [1,1,1,2,2,3]
k = 2
return [1,2]
nums = [1]
k = 1
return [1]
A. 답
nums = [1,1,2,2,2,3];
k = 2;
function topK(nums, k) {
const obj = {};
nums.forEach((x) => {
if(obj[x]) {
obj[x] = obj[x] + 1;
}else{
obj[x] = 0 + 1;
}
});
let arr = Object.values(obj).sort((a, b) => b - a).slice(0, k);
const result = [];
for(i = 0; i < arr.length;i++){
result.push(parseInt(Object.keys(obj).find(key => obj[key] == arr[i])));
}
return result
}
topK(nums, k) // [ 2, 1 ]
!! 지난 번과 다른 매서드를 사용해 보기
✔️해석
function topK(nums, k) {
const obj = {};
// 중복 값 카운트
nums.forEach((x) => {
if(obj[x]) {
obj[x] = obj[x] + 1;
}else{
obj[x] = 0 + 1;
}
});
// const obj = { '1': 2, '2': 3, '3': 1 };
let arr = Object.values(obj).sort((a, b) => b - a).slice(0, k);
// 1. obj의 value값으로만 배열 구성
// [ 2, 3, 1 ]
// 2. sort()로 내림차순(큰 값 > 작은 값)로 정렬
// [ 3, 2, 1 ]
// 3. slice()로 배열의 첫 요소부터 k개 자름
// arr = [ 3, 2 ]
const result = [];
for(i = 0; i < arr.length;i++){
result.push(parseInt(Object.keys(obj).find(key => obj[key] == arr[i])));
// 1. obj의 key값으로만 된 배열에서
// [ '1', '2', '3' ]
// 2. find() 메서드로 "obj[key]의 값과 arr[i]의 값이 일치하는 value를 찾음
// arr[0] = 3이므로 value값이 3인 키값은 '2'
// arr[1] = 2이므로 value값이 2인 키값은 '1'
// 3. 2에서 찾은 값은 string 이르므로 Number() 또는 parseInt()를 사용해 number형으로 변환
// 4. 두 값을 차례로 reslut 배열에 추가
}
return result
}
topK([1,1,2,2,2,3],2) // [ 2, 1 ]
반응형