[CodeKata] #09, 가장 자주 등장한 숫자를 k 개수 만큼 return

April·2021년 5월 9일
0
post-thumbnail
post-custom-banner

문제

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

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

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

💡 풀이

  1. 인자로 받은 nums의 각 숫자별 갯수 세기 numsObj
  2. object인 numsObj를 key와 value로 이루어진 배열을 arr에 할당
  3. arr을 값 기준 내림차순으로 정렬 arr.sort((a, b) => (b[1] - a[1]))
  4. k번째까지만 잘라내서 Number형태로 리턴

✅ 코드

function topK(nums, k) {
    const numsObj = {};
    nums.forEach(el => {
      numsObj[el] == undefined ? numsObj[el] =  1 : numsObj[el]++;
    });
    
    let arr = Object.entries(numsObj)
    return arr.sort((a, b) => (b[1] - a[1])).slice(0,k).map(el => Number(el[0]));
}

const nums = [2,2,3,1,1,1];
const k =2;
console.log(topK(nums, k));

✅ (test case 한 개를 통과 못한) 나의 코드

function topK(nums, k) {
  const numsObj = {};
  for (let num of nums) {
    numsObj[num] == undefined ? numsObj[num] =  1 : numsObj[num]++;
  }
  const objKey= Object.keys(numsObj).sort()
  const objValue = Object.values(numsObj).sort((a,b) => b-a);
  const newobjValue = []
  let result = 0;
  let result2;
  
  for (let i=0; i<nums.length; i++) {
    objKey.push(objValue[i])
  }
   if (objKey[0][0]==='-') {
      return objKey[0]*-1
   }
  result = objKey.join('').substr(0,k).split('')
  return result.map(el => Number(el))
}

const nums = [1,1,1,2,2,3];
const k =2;
console.log(topK(nums, k)) // [1,2]

🎈 What i learned

  • test case 5개 중 1개를 통과못하고 있는 코드..

  • 이유는 인자로 음수를 받을 경우 객체로 변환 시 정렬이 내림차순으로 정렬되지 않는 문제.. 고로.. 다시 짜야하는 코드..

  • 21-05-09 다시 짠 코드로 글 수정 완료

profile
🚀 내가 보려고 쓰는 기술블로그
post-custom-banner

0개의 댓글