Code Kata_topK

dabin *.◟(ˊᗨˋ)◞.*·2021년 9월 9일
0

CodeKata

목록 보기
6/9
post-thumbnail

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

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

return [1,2]

nums = [1]
k = 1

return [1]

풀이

  1. 빈 객체 선언
  2. nums 배열을 순회하며
  3. 요소(숫자)가 객체의 key로 있으면 +1, 없으면 생성하고 1로 설정
  4. 객체를 이차원 배열로 만들기
  5. 배열 속 배열의 index1을 sort해 내림차순으로 정렬
  6. 이렇게 만들어진 배열을 k만큼 순회하며 새로운 배열에 배열 속 배열의 index0을 Push
function topK(nums, k) {
  let obj = {};
  for(let i=0; i<nums.length; i++) {
    if(nums[i] in obj) {
	  obj[nums[i]] += 1
    } else {
     obj[nums[i]] = 1
	}
  }
  const arr = Object.entries(obj)
  const result = [];
  arr.sort(function(a,b){return b[1]-a[1]})
  for(let i=0; i<k; i++) {
	result.push(arr[i][0])
  }
  return result.map(num => Number(num));
}
//팀원분께서 알려주신 것! 
//arr를 선언하기 전까지의 코드는 reduce로 코드를 간결하게 작성할 수 있다.
const obj = nums.reduce((acc, cur) => {
  acc[cur] = (acc[cur] || 0) + 1;
  return acc;
}, {})

array.sort()
반환값은 정렬한 배열. 복사본이 아니고 원래 배열이 달라진다.

arr.sort([compareFunction])

정렬 순서를 정의하는 compareFunction이 생략되면 배열의 요소들은 문자열로 취급되고, 유니코드 값 순서로 정렬된다.

compareFunction은 두 개의 배열 element를 파라미터로 입력받고, 리턴하는 값이 0보다 작을 경우 a => b 순서, 0보다 클 경우 b => a 순으로 정렬한다. 0을 반환하면 서로에 대해 변경하지 않고 다른 요소들을 정렬한다.

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

숫자를 비교하면 a에서 b를 빼거나 b에서 a를 빼는 등의 함수를 만들어 정렬할 수 있다.

function compareNumbers(a, b) {
  return a - b;
}

함수가 너무 복잡해지는 경우 map메서드를 사용하는 것이 나을 수도 있다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Object.entries()
[key, value] 쌍의 배열을 반환한다.

const obj ={
  1: 1,
  2: 2,
  3: 3
}

console.log(Object.entries(obj))
//[["1", 1], ["2", 2], ["3", 3]]
//key 값은 문자열로 들어오니 주의해서 사용하자. 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
array.reduce()

const array = [2, 3, 4, 12, 14];
const sum = array.reduce(function(accumulator, currentValue) {
  console.log(accumulator) // 2 5 9 21 35
  console.log(currentValue) // 3 4 12 14
  return accumulator + currentValue;
})

console.log(sum)//35

---------------------------------------------------------------

const array2 = [
  {name: "dabin",
   age: 25},
  {name: "seokjun",
   age: 70},
  {name: "geumrye",
   age: 60}
];

const sum2 = array2.reduce((acc,value) => acc + value.age, 0); //초기값 0
console.log(sum2) //155
profile
모르는것투성이

0개의 댓글