문제
nums는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.
nums = [1,1,1,2,2,3],
k = 2
return [1,2]
nums = [1]
k = 1
return [1]
풀이
function topK(nums, k) {
let obj = {};
for(let i=0; i<nums.length; i++) {
if(nums[i] in obj) {
obj[nums[i]] += 1
} else {
obj[nums[i]] = 1
}
}
const arr = Object.entries(obj)
const result = [];
arr.sort(function(a,b){return b[1]-a[1]})
for(let i=0; i<k; i++) {
result.push(arr[i][0])
}
return result.map(num => Number(num));
}
//팀원분께서 알려주신 것!
//arr를 선언하기 전까지의 코드는 reduce로 코드를 간결하게 작성할 수 있다.
const obj = nums.reduce((acc, cur) => {
acc[cur] = (acc[cur] || 0) + 1;
return acc;
}, {})
array.sort()
반환값은 정렬한 배열. 복사본이 아니고 원래 배열이 달라진다.
arr.sort([compareFunction])
정렬 순서를 정의하는 compareFunction이 생략되면 배열의 요소들은 문자열로 취급되고, 유니코드 값 순서로 정렬된다.
compareFunction은 두 개의 배열 element를 파라미터로 입력받고, 리턴하는 값이 0보다 작을 경우 a => b 순서, 0보다 클 경우 b => a 순으로 정렬한다. 0을 반환하면 서로에 대해 변경하지 않고 다른 요소들을 정렬한다.
function compare(a, b) {
if (a is less than b by some ordering criterion) {
return -1;
}
if (a is greater than b by the ordering criterion) {
return 1;
}
// a must be equal to b
return 0;
}
숫자를 비교하면 a에서 b를 빼거나 b에서 a를 빼는 등의 함수를 만들어 정렬할 수 있다.
function compareNumbers(a, b) {
return a - b;
}
함수가 너무 복잡해지는 경우 map메서드를 사용하는 것이 나을 수도 있다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
Object.entries()
[key, value] 쌍의 배열을 반환한다.
const obj ={
1: 1,
2: 2,
3: 3
}
console.log(Object.entries(obj))
//[["1", 1], ["2", 2], ["3", 3]]
//key 값은 문자열로 들어오니 주의해서 사용하자.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
array.reduce()
const array = [2, 3, 4, 12, 14];
const sum = array.reduce(function(accumulator, currentValue) {
console.log(accumulator) // 2 5 9 21 35
console.log(currentValue) // 3 4 12 14
return accumulator + currentValue;
})
console.log(sum)//35
---------------------------------------------------------------
const array2 = [
{name: "dabin",
age: 25},
{name: "seokjun",
age: 70},
{name: "geumrye",
age: 60}
];
const sum2 = array2.reduce((acc,value) => acc + value.age, 0); //초기값 0
console.log(sum2) //155