본문 바로가기
알고리즘

[CodeKata] week 2 - Day 4 ( JavaScript )

by 프린벼르 2022. 2. 26.

코드카타 2주차 4번문제

function topK(nums, k) {
  // 예시 : [2,2,3,3,3,1]
  let obj = {};
  let result = [];

 // 1. 오름차순 정렬
  nums.sort(); // 넣으면 에러 뜸
  console.log(nums);
  
  // 2. {등장 횟수 : 숫자} 객체 만들기
  for (let i = 0; i < nums.length; i++) {
    let key = nums.filter(e => e === nums[i]).length;
    let value = nums[i];
    obj[key] = value;
  }
  console.log(obj);

  // 3. 등장 횟수 내림차순 정렬
  const keys = Object.keys(obj);
  console.log(keys);

  let numsArray = [];
  for (key of keys) {
    numsArray.push(Number(key));
    numsArray.sort((a, b) => b - a);
  }
  console.log(numsArray);

  // 4. k등까지 등장 횟수 뽑고, obj에서 해당하는 숫자 리턴
  for (let i = 0; i < k; i++) {
    result.push(obj[numsArray[i]]);
  }
  
  return result;
}

console.log(topK([2,3,2,3,2,1], 2));

module.exports = { topK };

오름차순 정렬을 하면 오류가 뜨는데 내림차순 정렬을 하면 오류가 나지 않았다. 아직까지도 왜 그런지는 참 의문이다. 굳이 정렬을 해줄 필요는 없었지만, 깔끔하게 정리된 채로 풀고 싶어서 정렬을 사용했다. 처음엔 객체를 만들때 { 숫자 : 등장 횟수 } 를 사용했는데, 이것 보다는 { 등장횟수 : 숫자 } 이렇게 써서 풀어주는 편이 더 쉽게 문제를 해결할 수 있었던 것 같다. filter함수를 사용하는 것이 아직도 익숙하지 못해서 많이 힘들었다. 좀 더 filter함수를 가지고 많이 사용해보아야할 것 같다.


# filter 함수

자바스크립트의 filter 메서드는 조건을 주고 해당 조건이 참인 요소를 모아 새로운 배열로 반환하는 메서드이다.

배열에서 원하는 데이터만 추출 하고 싶을 때 자주 사용하는 사용성이 좋은 메서드이다. 

여기서 잘 기억하고 있어야 하는 부분은 새로운 배열을 반환해준다는 점이다.

또한 filter는 중복값을 제거해주지 않는다. 따라서 중복값이 나올 수 있다. 

아래는 filter함수의 사용법 3가지이다.

① list.filter(function(word){return word.length >=6; })

② list.filter(word => word.length >= 6);

③ function filterCallbackFunction(word){return word.length >= 6; };
    list.filter(filterCallbackFunction);

댓글