nums는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.
nums = [1,1,1,2,2,3], k = 2 return [1,2] nums = [1] k = 1 return [1]
const frequentNum = {};
for (let i in nums) {
frequentNum[nums[i]] = (frequentNum[nums[i]] || 0) + 1;
}
const numvalues = Object.values(numObj).map(el => el).sort((a, b) => b - a);
const kValues = numvalues.slice(0, k);
여기서 살짝 문제가 생겼다.
value를 따로 배열로 만들어서 정렬할 경우 이 값에 맞는 키 값을 출력하도록 로직을 짜야 하는데 이것이 너무 번거롭다고 느껴졌다.
그래서 객체의 안에 있는 키와 value를 같이 배열에 저장하여 한꺼번에 정렬하도록 하여 키를 출력하도록 코드 로직을 변경하였다.
function topK(nums, k) {
const frequentNum = {};
const result = [];
for (let i in nums) {
frequentNum[nums[i]] = (frequentNum[nums[i]] || 0) + 1;
}
const entries = Object.entries(frequentNum);
const sortEntries = entries.sort((a,b) => {
return b[1] - a[1];
})
for (let i in sortEntries) {
sortEntries.length = k;
result.push(parseInt(sortEntries[i][0]));
}
return result;
}
entries()는 객체 안에 있는 키와 value를 배열로 저장하는 함수이다. 이 함수를 이용해서 키와 값이 들어있는 배열을 생성하고 통째로 내림차순 해주었다.
그리고 새 배열에다가 길이 k만큼 push 해주었더니 결과가 나왔다!