nums는 숫자로 이루어진 배열입니다.
가장 자주 등장한 숫자를 k 개수만큼 return해주세요.
nums = [1,1,1,2,2,3],
k = 2
return [1,2]
nums = [1]
k = 1
return [1]
나의 답변
function topK(nums, k) { let obj = {}; for( let i=0; i<nums.length; i++){ (nums[i] in obj) ? obj[nums[i]] += 1 : obj[nums[i]] = 1 } //console.log(obj); { '1': 2, '2': 4, '3': 1 } let test = Object.keys(obj).sort(function(a,b){ return obj[b] - obj[a] }) //console.log(test); [ '2', '1', '3' ] test.slice(0, k); return test.slice(0, k).map( e => parseInt(e)); } //[ 2, 1 ] topK( [1,1,2,2,2,2,3], 2 )
- obj란 빈 객체를 만들어놓고 for문을 돌린다
- for문이 돌면서 빈 객체 안에서
(nums[i] in obj) ?
obj안에 nums[i]가 존재하지 않는다면,obj[nums[i]] = 1
로 자체적으로 새로 추가해준다[ '1' : 1 ]
- obj안에 nums[i]가 존재한다면
obj[nums[i]] += 1
기존 key값에 +=1- 결과값은
{ '1': 2, '2': 4, '3': 1 }
- 이제 높은 value값 순서대로 나열하고 싶다. value값을 비교해 내림차순 으로 정렬하기 위해
sort함수
를 사용
sort 함수 내림차순
.sort( function(a,b){ return obj[b] - obj[a] } )
.sort( (a,b) => obj[b] - obj[a] )
.sort( (a,b) => b-a )
sort함수의 매개변수 a와 b는 배열의 자리이다.
a는 뒷자리, b는 앞자리이다. 그래서 함수를 이용해 뒷자리와 앞자리를 비교하는데,
return 값이 음수 일경우, sort는 배열의 자리를 변경해주고,
값이 양수 일경우, sort는 배열의 자리를 그대로 반환한다.
sort 함수 오름차순
.sort( (a,b) => a-b )
sort(function(a,b){ return obj[b] - obj[a] }
을 이용하여 추출한 value값이-2 3 1
우리가 필요한건 key값이니
Object.keys(obj)
를 붙여주자!!!결국 높은 순서대로의 key값은 결국
[ '2', '1', '3' ]
이 중에서 k값 만큼만 추출하려면
slice함수
를 이용!test.slice(0, k); => [ '2', '1' ]
마지막으로 우리가 뽑아야 하는건 숫자값인데
인자 하나 변경 => parseInt
전체 배열 값 변경=> map함수
return test.slice(0, k).map( e => parseInt(e));
[1, 2]
많은 함수들이 사용되었다...
부족했던 함수들은 다시 정리해보자
삼항연산자 & sort() & Object.keys() & slice() & map()