[Code Kata] JavaScript #8

ojae kwon·2021년 5월 6일
  1. 문제

    • nums는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.
      ex) nums = [1,1,1,2,2,2,2,3,3,4,] 면 return 2,1

  1. 문제 해결 방법 구상

    1) 인자로 받은 배열의 포함된 숫자를 '숫자: 갯수' 형태의 객체로 변환한 후, 갯수 기준으로 정렬 한 후 이때의 숫자를 앞에서 부터 k 의 갯수만큼 잘라내서 return 하는 함수 구현

    2) 객체를 갯수기준 내림차순으로 정렬하기위해 [숫자, 갯수] 를 값으로 하는 배열로 변환, sort 를 응용하여 갯수 기준 내림차순으로 정렬, 이렇게 정렬한 배열의 각 값의 0번 index 값(=숫자) 으로 된 배열 생성

    3) 이 배열을 앞에서부터 slice 를 이용하여 맨 앞에서부터 k 글자만큼 잘라낸 값을 숫자형 으로 변환하여 리턴


3. 코드 작성
function topK(nums, k) {

  let sortedObj = [];
  let result = [];
  let numObj = {};

  for (let i of nums) {					// 받은 인자를 가지고 숫자:갯수 로 구성된 객체 numObj를 생성
    numObj[i] ? (numObj[i] += 1) : (numObj[i] = 1);
  }

  for (let key in numObj) {				// 객체를 [숫자, 갯수] 를 값으로 하는 배열로 변환
    sortedObj.push([key, numObj[key]]);  
  }
  
  let a = sortedObj.sort(function (a, b) {
    return b[1] - a[1];  				// 배열을 객수기준 내림차순으로 정렬
  });
  
  for (let i of a) {
    result.push(i[0]);					// 정렬된 배열의 0번 index 값(=숫자) 만 배열로 변환
  }
  
  return result.slice(0, k).map((i) => i * 1); 		// 변환한 배열의 앞에서부터 k 개만큼 잘라내고 숫자형으로 변환하여 리턴
}

  1. 작성 후 느낀점

    1) 문제 해결을 위해 배열 <-> 객체 전환이 꽤 잦은데 이럴 때 원하는 값을 뽑아내는 것이나, 정렬하는 것 등 데이터를 가공하는 방법에 대해 좀 더 알아봐야 할 것 같다

0개의 댓글