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 ]
반응형
'D.evelop [CS] > Algorithm' 카테고리의 다른 글
[Algorithm 013] JS - complexNumberMultiply (0) | 2021.10.06 |
---|---|
[Algorithm 012] JS - reverseString (0) | 2021.10.05 |
[Algorithm 010] JS - moreThanHalf (0) | 2021.10.02 |
[Algorithm 009] JS - romanToNum (0) | 2021.09.27 |
[Algorithm 008] JS - 1주차 test 다시 풀기 (0) | 2021.09.23 |
댓글