210826 배열의 요소의 등장 빈도수

문제

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

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

return [1,2]

nums = [1]
k = 1

return [1]

문제이해

topK() 함수의 받을 매개변수는 nums 배열과 k 정수이고
배열에서 빈도수가 높은 것을 찾아야 하기 때문에 배열 요소의 개수를 비교할 건데
배열 요소의 개수를 비교할 때에는 객체를 쓰면 좋다
따라서 빈 객체 하나를 선언할 것이다

그리고 배열의 요소를 처음부터 끝까지 찾을 것이기 때문에 for문을 돌릴 것이다

정답

function topK(nums, k) {
    let obj = {};
    for (let i in nums) {
        nums[i] in obj
            ? obj[nums[i]] += 1
            : obj[nums[i]] = 1
    }
    let sorted = Object
        .keys(obj)
        .sort((a, b) => obj[b] - obj[a])
    return sorted
        .slice(0, k)
        .map(x => parseInt(x));
}

코드설명

  1. 빈 객체 obj 먼저 선언
let obj = {};
  1. 배열의 요소를 하나씩 꺼내면서
    요소를 꺼낼 때에는 obj[i]도 좋긴 하지만 let i in nums 이 더 편하다고 한다

그리고
객체에 해당하는 요소가 있으면 → 그 요소의 키값 (value)에 +1 처리를하고
객체에 해당하는 요소가 없으면 → 그 요소의 키값 (value)을 1 로 부여한다

for (let i in nums) {
    nums[i] in obj
        ? obj[nums[i]] += 1
        : obj[nums[i]] = 1
}

/*
nums = [1,1,1,4,4,3];
=>
obj = {
  1: 3,
  4: 2,
  3: 1,
}
*/
  1. obj 객체의 속성 key를 배열로 반환하고

Object.keys(obj)

인자로 받은 obj 객체의 속성이름을 배열로 반환한다

Object.keys(obj)
// [1,4,3]
  1. 그렇게 반환된 배열의 속성 키를 키값에 대해서 오름순차적으로 정렬해준다
    (기존의 배열이 변경됨)

sort(익명함수)

sort함수 안에 있는 익명함수는 두개의 요소씩 비교하는데
a자리에는 뒤에 있는 요소, b자리에는 앞에 있는 요소가 들어간다

  • 익명함수의 return값이 양수 → 오름차순정렬
  • 익명함수의 return값이 음수 → 내림차순정렬
  • 익명함수의 return값=0 → 변경되지않음
    sort함수 더보기
let sorted = Object.keys(obj).sort((a, b) => obj[b] - obj[a])

// `a=4, b=1`& `a=3, b=1` & `a=4, b=1` 이런식으로 비교해서
// return값에 따라 정렬해서 배열을 변경해준다 
  1. sorted된 배열의 요소인 객체 obj의 key → 문자열이기 때문에 정수로 반환해준다
return sorted.slice(0, k).map(x => parseInt(x));

좋은 웹페이지 즐겨찾기