배열 안의 각 수가 등장한
빈도수
에 따라k
개의 갯수만큼 내림차순으로 배열로 받아 return해주는 문제이다. 객체의 성질을 활용하여 각 수와 해당 빈도수를 지정해주고, 내림차순으로 정렬해주어k
개만큼만 배열로 반환해주면 되는 문제기에 논리적 접근은 어렵지 않았다. 다만 내림차순 정렬을 하는 과정에서sort
의 내장함수를 통해 구현할 수 있었다는 점이 이 문제를 풀면서 중요했던 점이라고 생각한다.
function topK(nums, k) {
// 여기에 코드를 작성해주세요.
let newObj = {} // 숫자와 그에 해당하는 빈도를 key와 value로 지정할 객체
let sortObj = [] // 객체를 정렬하기 위한 배열
let finalArr = [] // 최종 return할 배열
// 객체에 각 숫자와 그에 해당 빈도 저장
for (let i in nums){
newObj[nums[i]] ? newObj[nums[i]]+=1:newObj[nums[i]]=1
}
// 객체를 배열로 저장
for (let number in newObj) {
sortObj.push([number, newObj[number]]);
}
// 저장한 배열을 두번째 인자의 내림차순으로 정렬
sortObj.sort(function(a, b) {return b[1] - a[1];});
// k 개수만큼 return할 배열에 push
for (i=0; i<k; i++){finalArr.push(Number(sortObj[i][0]))}
return finalArr // 최종 값 return
}
느낀 점
이번 문제는 접근은 쉽지만 내림차순 구현 방법을 모른다면 구현에서 하드 코딩으로 접근하여 시간을 많이 사용할 수 있는 문제였다. (물론 지금 방식도 하드 코딩이긴 하다만..) 내림차순으로 정렬을 하기 위해 객체를 배열로 바꿔주었고, 그 배열을 sort의 내장함수
(sortObj.sort(function(a, b) {return b[1] - a[1]})
)를 통해 구현해야 했다. 더 좋은 방법이 분명 많을 것이기 때문에 다른 사람들의 풀이들을 보며 더 효율적인 코드 작성 방법을 익혀야 할 것같다. (물론 sort의 저 내장함수는 매우 유용한 기능인 것 같다!)