이번주에 코드카타를 하면서 풀었던 문제에 대해 리뷰하고 정리해보겠습니다.

문제

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

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

nums = [1]
k = 1
return [1]

문제파악

  1. 인풋 : 숫자로 이루어진 배열이며 여러숫자들이 온다 , k는 숫자이며 그 숫자만큼 많이 나온 숫자를 선택하여 리턴해야함
  2. 아웃풋 : 배열의형태로 많이 나온 숫자들을 k 만큼 리턴한 값
  3. 해결방법
    (1) 일단 어떤 숫자가 많이 나왔는지 배열의 요소를 하나하나 확인해본다. -> for문 사용
    (2) 데이터관리를 잘 하기 위해서 배열을 객체화 한다. 이 때, 프로퍼티는 나온 숫자로 key 값은 나온 횟수가 될 수 있도록 한다.
    (3) 객체를 다시 배열로 만들어야 하기 때문에, 객체 property와 key값으로 이루어진 이중배열을 생성한다.
    (4) key값 만큼의 배열값을 리턴을 하기 위해 for 문을 활용한다.
    (5) 값을 리턴하고 답을 맞춰보면 끝 !

코딩

function topK(nums, k) {
 let obj = {};
  // 빈객체를 만든다
  for ( i = 0 ; i < nums.length; i ++ )  {
  if (!obj.hasOwnProperty(nums[i])) {
  obj[nums[i]] = 1;
  console.log('obj ; ',obj);
  }
  else { 
    obj[nums[i]] += 1;
  }
  }
// for 문을 돌려서 element 값을 확인한다,
   // if 조건을 활용해서, 해당 객체가 property로
   // nums[i]값을 가지고 있는지를 확인하고 없을 경우 
   // 객체의 프로퍼티를 설정하고, 1씩 증가할 수 있도록 한다.

  var result = Object.keys(obj).map(function(key) {
    return [Number(key), obj[key]];
  });
  console.log(result);
  // map 함수를 활용해서 이중배열을 만든다.
  // 객체의 각 요소를 map 함수를 활용해서, [ key, key값] 모양으로 이중배열을 생성

   result.sort(function compareNums(a,b){
   console.log('a:', a[1]);
   console.log('b:', b[1]);
   return b[1]- a[1]; 
   });
   console.log('resort:', result);
 // 만든 이중배열을 result라는 변수에 담아, 두번째 key값(숫자가 나온 횟수) 을 기준으로 내림차순으로 정렬한다


  let getNums = [];
  for (i=0; i<k; i++){
    getNums.push(result[i][0]);
    console.log('getNums:', getNums);
  }
  return getNums;
}  
// 정렬 후 for 문을 활용해서 k 개수의 직전까지 for문을 돌려서 빈 객체에 push해서 가장 많이 나온 값을 빈 배열에 넣는다 !
topK([1,1,1,2,2,3,4,4,4,4], 2);

이렇게 하면 문제 해결 끝~!!

  • map 함수는 array 안에 element 를 인자로 삼아서, 함수를 실행하는 method 다 !

  • 내림차순으로 배열을 정리해주는 함수

    arr.sort(function compaereNums(a,b){
    return b -a;
    });

    b값과 a값을 비교해서 sorting 해주는 함수다

  • 객체명.hasOwnProperty(property name)
    객체가 property name을 가지고 있는지 확인하는 method!