D.evelop [CS]/Algorithm

[Algorithm 011] JS - topK

Danne 2021. 10. 3. 01:15

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 ]

 

 

 

 

!! 지난 번과 다른 매서드를 사용해 보기

  • parseInt() : 문자열 중 숫자를 정수로 반환  MDN명세
  • find() :  주어진 판별 함수를 만족하는 첫 번째 요소의 값을 반환 MDN명세

 

✔️해석

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 ]

 

 

반응형