[CodeKata] 2.4 topK

hyeonze·2021년 12월 23일
0

주의 : js초보입니다+답나오는데 집중할겁니다 눈갱주의ㅜㅜ

문제

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

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

return [1,2]

nums = [1]
k = 1

return [1]

해석

젤많은애부터 배열에 k번 넣어 반환하는 함수 작성해라

사고

0.메서드 잘 못쓰니 집념으로 물고늘어지기
1.nums에서 중복제거한 배열 uniqueNums구하기
2.uniqueNum의 요소를 key로하는 obj만들기(값은 일단 0으로)
3.nums를 순회하며 요소를 카운트해서 obj의 값에 key의 요소의 빈도 저장
4.k번 반복하는 반복문에서 value값이 큰 key를 ret에 push
5.ret의 모든 요소를 숫자로 바꿔 반환(key는 문자열이니깐)

풀이

function topK(nums, k) {
  // 여기에 코드를 작성해주세요.
  let obj = {};
  let uniqueNums = [];
  let doubledArr;
  let maxValue;
  let maxKey = '';
  let ret = [];

  nums.forEach((el) => {
    if (!uniqueNums.includes(el)) {
      uniqueNums.push(el);
    }
  });
  
  uniqueNums.forEach(el => obj[el] = 0);
  nums.forEach(el => obj[String(el)]++);

  for (let j = 0; j < k; j++) {
    maxValue = 0;
    for (let i in obj) {
      if (obj[i] > maxValue) {
        maxValue = obj[i];
        maxKey = i;
      }
    }
      ret.push(maxKey);
      obj[maxKey] = 0;
  }
  
  for (let i = 0; i < ret.length; i++) {
    ret[i] = Number(ret[i]);
  }
      return (ret);
  
}

리팩토링 필요한 부분

사고 1~3의 과정을 한 번에 처리할 수 있을 것 같음(뭔가 테이블을 만들고 시작하고싶은 불안감 ㅠ)
사고 4~5의 과정도 요소를 숫자로 바꾸면서 push할 수 있을 것 같은데 자린이라 중단 ㅠ 리팩토링 도전해보기

profile
Advanced thinking should be put into advanced code.

0개의 댓글

관련 채용 정보