[Code Kata] Week 02-04

AM_I_TRASH·2022년 7월 17일

code-kata

목록 보기
5/6

숫자 배열을 인자로 받았을 때, 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.

nums = [1,1,1,2,2,3], k = 2 일 때
return: [1,2]
nums = [1], k = 1 일 때
return: [1]
function FrequentIntCount(nums, k) {
  											// console.log(nums)
  let incomeObj = new Set(nums)				// console.log(incomeObj)
  let incomeArray = Array.from(incomeObj)	// console.log(incomeArray)
  let compObj = {}

  // compObj 초기값 형성
  incomeObj.forEach((num) => {
    compObj[num] = 0;
  });										// console.log(compObj)

  // compObj value 변경
  let numsLen = nums.length
  for (var i = 0; i < numsLen; i++) {
    compObj[nums.shift()] += 1;
  }											// console.log(compObj)

  // 해시테이블화
  compArr = Object.values(compObj)
  let alpha = new Array(compArr.length + 1);
  for (var i = 0; i < compArr.length; i++) {
    alpha[compArr[i]] = incomeArray[i]
  }											// console.log(alpha)
  
  let result = []
  for (var i = 0; i < k; i++) {
    result.push(alpha.pop())				// console.log(result)
  }
  return result;
}

이걸 찾아볼 사람은 매우 특정적이기에 이야기하자면, Week 02 - 02번 문제와 로직이 흡사하다.
하지만, 로직 자체는 여전히 단순하기에, 코드가 매우 길다.. 로직은 다음과 같다.

인자로 받은 숫자들의 배열인 nums의 중복제거한 인자들을 key값으로,
nums 속 해당 인자들의 갯수를 value값으로 객체를 선언한 후
해당 값들을 해시테이블 화 하여 정렬하고 출력하는 코드이다.

  1. 먼저 let incomeObj = new Set(nums)을 통해 중복제거한 nums 배열을 incomeObj에 복사하는데, 여기서 set 함수는 객체를 반환하므로 let incomeArray = Array.from(incomeObj)를 통해 배열로 변환해준다.
  1. 그 후 비교용 객체 compObj를 선언하여 상기하였듯 key와 value 쌍을 추가해주는 과정.
    초기값 형성과 value 변경이 여기에 속한다.

  2. 그 다음은 해시테이블화인데, 이 부분은 스스로 직접 이해해 보는 편이 좋을 것 같다.

    힌트를 주자면, key값을 alpha배열의 index로, 해당하는 index의 값을 value로 사용하여
    2차원으로써 그려져야 할 데이터쌍을 1차원으로 구현한 것이다. 해시테이블 변수 명은 alpha.
    당연히 key값을 index로 사용해야 하기 때문에, 배열의 길이가 1 더 늘어난다는 점 참고해주면 좋겠다.

  1. 그 후, 역순으로 정렬된 해시테이블을 뒤에서부터 팝!하여 k개만큼 출력해주면 문제는 끝!

여기서 해시테이블이 무엇이고 왜 사용하는가에 대해 궁금한 사람들은 아래 유튜브를 시청하고 오면 좋다!
https://www.youtube.com/watch?v=xls6jEZNA7Y
광고아니에요 저 아닙니다 그냥그렇다고요

profile
짝퉁 프로그래머

0개의 댓글