문제

nums는 숫자로 이루어진 배열입니다.

가장 자주 등장한 숫자를 k 개수만큼 return해주세요.

function topK(nums, k) {

  let mySet =[...new Set(nums)];

  let arrNum = [];
  let str = nums.join(",").replace(/,/gi,"");
  
  for(let i = 0;i < mySet.length;i++){
    let nStr = new RegExp(mySet[i],'gi');
    
    arrNum.push([mySet[i],str.match(nStr).length])
  }

  arrNum = arrNum.sort((a, b) => b[1] - a[1]).slice(0,k).map(cur => cur[0] ); 
  return arrNum;
 
}

수정되면 좋은 Code 및 사항

  1. join을 잘 이용하면 replace 메서드를 쓰지 않아도 된다.

    let str = nums.join(",").replace(/,/gi,"");
    
    // 결과값: [1,1,1] -> [111]
    

    👇

    nums.join("");
    // 결과값: [1,1,1] -> [111] 
    
  2. 값을 계속 가져오지 않고 한 번만 가져오는게 낫다.

      for(let i = 0;i < mySet.length;i++){
      }
    

    👇

      for(let i = 0, len = mySet.length; i < len; i++){
    
      }
    
  3. 어짜피 한 번만 선언될 변수면 그냥 풀어쓰는게 낫다. (복잡하면 선언해주는게 좋다.)

      for(let i = 0;i < mySet.length;i++){
        let nStr = new RegExp(mySet[i],'gi');
        
        arrNum.push([mySet[i],str.match(nStr).length])
      }
    

    👇

      for(let i = 0; i < mySet.length; i++){
        arrNum.push([mySet[i],str.match(new RegExp(mySet[i],'gi')).length]);
      }
    
  4. Array.from을 쓰면 코드를 여러번 나누지 않아도 한 번에 쓸 수 있다.

      for(let i = 0;i < mySet.length;i++){
        let nStr = new RegExp(mySet[i],'gi');
        
        arrNum.push([mySet[i],str.match(nStr).length])
      }
    
      return arrNum.sort((a, b) => b[1] - a[1]).slice(0,k).map(cur => cur[0] ); 
    

    👇

    return Array.from({length: mySet.length}, (_, i) => [mySet[i], str.match(new RegExp(mySet[i],'gi')).length])
           .sort((a, b) => b[1] - a[1])
           .slice(0, k).map((v, k) => v[0])
    
  5. 정규식은 컴퓨터에서 계산을 맡긴다는 의미이므로, 쓸 곳과 안 쓸 곳을 잘 구분하는게 좋다!