문제
nums는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.문제 해결 방법 구상
1) 인자로 받은 배열의 포함된 숫자를 '숫자: 갯수' 형태의 객체로 변환한 후, 갯수 기준으로 정렬 한 후 이때의 숫자를 앞에서 부터 k 의 갯수만큼 잘라내서 return 하는 함수 구현
2) 객체를 갯수기준 내림차순으로 정렬하기위해 [숫자, 갯수] 를 값으로 하는 배열로 변환, sort 를 응용하여 갯수 기준 내림차순으로 정렬, 이렇게 정렬한 배열의 각 값의 0번 index 값(=숫자) 으로 된 배열 생성
3) 이 배열을 앞에서부터 slice 를 이용하여 맨 앞에서부터 k 글자만큼 잘라낸 값을 숫자형 으로 변환하여 리턴
function topK(nums, k) {
let sortedObj = [];
let result = [];
let numObj = {};
for (let i of nums) { // 받은 인자를 가지고 숫자:갯수 로 구성된 객체 numObj를 생성
numObj[i] ? (numObj[i] += 1) : (numObj[i] = 1);
}
for (let key in numObj) { // 객체를 [숫자, 갯수] 를 값으로 하는 배열로 변환
sortedObj.push([key, numObj[key]]);
}
let a = sortedObj.sort(function (a, b) {
return b[1] - a[1]; // 배열을 객수기준 내림차순으로 정렬
});
for (let i of a) {
result.push(i[0]); // 정렬된 배열의 0번 index 값(=숫자) 만 배열로 변환
}
return result.slice(0, k).map((i) => i * 1); // 변환한 배열의 앞에서부터 k 개만큼 잘라내고 숫자형으로 변환하여 리턴
}
작성 후 느낀점
1) 문제 해결을 위해 배열 <-> 객체 전환이 꽤 잦은데 이럴 때 원하는 값을 뽑아내는 것이나, 정렬하는 것 등 데이터를 가공하는 방법에 대해 좀 더 알아봐야 할 것 같다