알고리즘 : 가장 많은 수를 k개수만큼 찾기

dory·2021년 5월 7일
0

알고리즘

목록 보기
5/7

📌 문제

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

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

📌 풀이

💩 첫 시도

function topK(nums, k) {
  let numObj = {};
  for (let num of nums){
    numObj[num] ? numObj[num] += 1 : numObj[num] = 1
  }

  let keyOfObj = [];
  for (let key in numObj) {
    keyOfObj.push([key, numObj[key]])
  }

  let sortedByKey = keyOfObj.sort(function (a, b) {
    return b[1] - a[1];
  });
  
  let result = [];
  for (let key of sortedByKey) {
    result.push(key[0]);
  }
  return result.slice(0, k).map((i) => i * 1);
}

- 굉장히 보오옥잡하고 복잡하기보다는 읽기가 어렵다. 내가 봐도 잘 모르겠다..!

  • 인자로 받은 nums를 각각의 요소에 대한 개수 정보를 담은 새로운 객체(numObj)를 만든다.
  • numObj의 value를 기준으로 내림차순으로 재정렬한다.
    -> key와 value로 이루어진 배열을 담는 배열을 만듦 : keyOfObj
    -> keyOfObj를 value 즉 인덱스1을 기준으로 sort함
  • keyOfObj에서 key값만을 result에 담고, k개수 만큼 나올 수 있도록 slice한다.
  • 이때 string으로 값이 나오므로, map을 사용하여 1을 곱해서 num으로 바꾸어 리턴한다.

포인트는
1) 개수정보를 담은 새로운 오브젝트 만들기
2) 해당 오브젝트를 개수(value)를 기준으로 정렬
3) k개수만큼 key값 return하기
4) 이때 type은 num이여야함

♻️ 리펙토링

function topK(nums, k) {
  const numObj = {};
  for (let num of nums) numObj[num] ? (numObj[num] += 1) : (numObj[num] = 1);
  const sortedObj = Object.entries(numObj).sort(function (a, b) {
    return b[1] - a[1];
  });
 return sortedObj.map(key=> Number(key[0])).slice(0, k)
}
  • 코드블럭이 아닌 한 줄을 코드는 중괄호가 필요없다!
  • Object.entries(객체)를 사용하면 key와 value로 이루어진 배열을 요소로 갖는 배열을 만들 수 있다!
  • 위에서 만든 새로운 배열(sortedObj)을 map으로 num type의 첫 인덱스 값(원하던 key값)을 모은 배열을 만든다!
  • map의 결과를 처음부터 k까지 잘라서 return한다!

1개의 댓글

comment-user-thumbnail
2021년 5월 7일

첫시도에 💩 모냐고요ㅠㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기