숫자 배열을 인자로 받았을 때, 가장 자주 등장한 숫자를 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값으로 객체를 선언한 후
해당 값들을 해시테이블 화 하여 정렬하고 출력하는 코드이다.
let incomeObj = new Set(nums)을 통해 중복제거한 nums 배열을 incomeObj에 복사하는데, 여기서 set 함수는 객체를 반환하므로 let incomeArray = Array.from(incomeObj)를 통해 배열로 변환해준다.그 후 비교용 객체 compObj를 선언하여 상기하였듯 key와 value 쌍을 추가해주는 과정.
초기값 형성과 value 변경이 여기에 속한다.
그 다음은 해시테이블화인데, 이 부분은 스스로 직접 이해해 보는 편이 좋을 것 같다.
힌트를 주자면, key값을 alpha배열의 index로, 해당하는 index의 값을 value로 사용하여
2차원으로써 그려져야 할 데이터쌍을 1차원으로 구현한 것이다. 해시테이블 변수 명은 alpha.
당연히 key값을 index로 사용해야 하기 때문에, 배열의 길이가 1 더 늘어난다는 점 참고해주면 좋겠다.
여기서 해시테이블이 무엇이고 왜 사용하는가에 대해 궁금한 사람들은 아래 유튜브를 시청하고 오면 좋다!
https://www.youtube.com/watch?v=xls6jEZNA7Y
광고아니에요 저 아닙니다 그냥그렇다고요