ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Javascript:: 가장 자주 등장한 숫자를 k개수만큼 return
    알고리즘 2020. 7. 16. 12:01
    <문제>
    nums는 숫자로 이루어진 배열입니다.
    가장 자주 등장한 숫자를 k 개수만큼 return 해주세요.


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

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

     

     

    배열에서 같은 숫자, 글자 등 같은 값의 갯수를 서로 비교하고 싶다면 우리는 '객체'를 이용하면된다.

     

    고로 for문을 돌려서 요소 하나하나를 객체의 key값과 비교하고, key값에 있다면 count 를 늘려주고, 

    없다면 객체 key에 넣어준다. 아래와 같이 코드를 작성한다.

     

    function topK(nums, k) {
      let obj = {};
      
      for (let i=0; i < nums.length; i++) {
        (nums[i] in obj) ?
        obj[nums[i]] += 1
        : obj[nums[i]] = 1
      }
      
      console.log(obj);
    }
    
    topK([1,1,1,2,2,3]);
    
    // { 1: 3, 2: 2, 3: 1}

     

     

    이제는 이 객체를 가지고 key의 value값을 비교하며 내림차순 정렬을 해주어야 나중에 k수 만큼 그 배열을 잘라서 return 해줄 수 있다.

     

    고로 우리는 Keyd의 value값을 비교해 내림차순 정렬하기 위해 sort함수를 이용할 것이다.

     

    ** sort 함수 **

    .sort(function(a,b))
    sort함수의 매개변수 a와 b는 배열의 자리이다. 
    a는 뒷자리, b는 앞자리이다. 그래서  함수를 이용해 뒷자리와 앞자리를 비교하는데, 
    return 값이 음수 일경우, sort는 배열의 자리를 변경해주고, 
    값이 양수 일경우, sort는 배열의 자리를 그대로 반환한다.

     

    function topK(nums, k) {
      let obj = {};
      
      for (let i=0; i < nums.length; i++) {
        (nums[i] in obj) ?
        obj[nums[i]] += 1
        : obj[nums[i]] = 1
      }
      
      let test = Object.keys(obj).sort(function (a, b) {
        return obj[b] - obj[a];
      }
      
      console.log(test)
    }
    
    topK([1,1,1,2,2,3]);
    
    // [1, 2, 3]

     

    그러면 이제 우리는 value값이 내림차순으로 정렬된 key배열을 k수 만큼 반환해야 하므로

    필요한 개수만큼 배열을 잘라주는 slice함수를 이용한다.

     

    그러나! 우리는 지금 Object.keys()로 key값들을 배열의 형태로 받아오면서 string값으로 저장되었다.

     

    그래서 우리는 다시 이 숫자를 parseInt해주어야 한다. 그런데 parseInt는 배열 전체의 값을 바꿀 수 없기에, 

    전체의 배열 값을 변경해주는 map함수를 이용한다. 

     

     

    알고리즘을 총 풀이한 과정과 결과는 아래와 같다. 

     

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

     

     

    비슷한 해결과정이지만, 또 다른 코드는 아래와 같다.

     

    function topK(nums, k) {
        let obj = {};
        let arr = [];
        
        nums.forEach(el => {
            if (obj[el]) {
                obj[el]++;
            } else {
                obj[el] = 1;
            }
        });
        
        for (let properyName in obj) {
            arr.push([properyName, obj[properyName]]);
        }
        
        return arr.sort((a, b) => (b[1] - a[1])).slice(0,k).map(el => Number(el[0]));
    }
    
    topK([1,2,2,2,3,4,4,4,4] , 2);

    댓글

Designed by Tistory.