코드카타 #09

문제

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

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

return [1,2]

nums = [1]
k = 1

return [1]

풀이

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

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

console.log(topK(nums, k))   //  결과값 [1, 2]

풀이 과정

  • 배열에서 같은 숫자, 글자 등 같은 값의 갯수를 서로 비교할때는 객체형이 편하므로 obj라는 빈 객체를 선언해 줍니다
  • for in문을 돌려서 요소 하나하나를 객체의 key값과 비교하고 삼항 연산자를 사용해 key값에 있다면 1을 증가하고 없다면 객체 key에 넣어줍니다.
  • arr라는 변수에 Object.keys를 이용해 key값만 불러옵니다
  • 불러온값을 내림차순 정렬하기 위해 sort함수를 사용해 줍니다.
  • 내림차순으로 정렬된 변수arrslice 메서드를 사용해 0번째 인덱스부터 k번째 까지 잘라줍니다
  • 잘라주면 ["1", "2"] 처럼 안에 값들이 스트링 형태로 되어 있어서 parseInt()를 사용해 숫자형으로 바꿔서 return해줍니다

좋은 웹페이지 즐겨찾기