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) { // K 수만큼 가져올 숫자열들을 보관할 배열 변수 let arr = []; // nums배열의 숫자열을 객체로 보관할 객체 변수 let obj = {}; let arr2 = []; // 배열 메서드, 콜백함수로 배열의 첫번째부터 마지막까지 반복하면서 함수 실행 // for (let i = 0; i < nums.length; i++) nums.forEach((i) => { // 만약 객체에 배열의 값이 있다면 // if(obj.hasOwnProperty(obj[i] === true) // 오브젝트안에 해당 값이 있다면 boolean으로 반환 if (obj[i]) { // 객체의 해당 키의 값에 카운트를 올린다 // obj[i] = ++ obj[i]++; } else { // 객체 안에 값이 없다면 키와 값을 하나 생성시킴 obj[i] = 1; } }); // 이제 객체를 값의 크기순으로 정렬시켜야한다. // 구글링을 통해 for...in 함수로 객체를 반복시켜 // 빈 배열에 push 메서드([반복되는 숫자, 객체의 반복되는 숫자])를 통해 배열에 넣는다 for (let j in obj) { arr.push([j, obj[j]]); } // 해당 마지막 부분은 도움을 받았다. // 위 반복문 실행을 통해 배열이 된 객체를 정렬한다. // arr.sort((a,b) => b[1] - a[1]) // sort는 정렬 순서를 정의하는 콜백함수를 통해 정렬한다. // https://hianna.tistory.com/409 // sort에 매개변수 a, b가 주어진다면, 함수가 리턴하는 값이 0보다 작으면 a가 b보다 앞에 오도록 정렬한다. (작은 값부터) // sort에 매개변수 a, b가 주어진다면, 함수가 리턴하는 값이 0보다 크면 b가 a다 앞에 오도록 정렬한다. (큰 값부터) // return ( arr // 배열안에 배열이 있기때문에 해당 배열의 2번째, 즉 기존 객체의 value 값을 선택해서 큰 값부터 정렬한다 .sort((a, b) => b[1] - a[1]) // 그리고 정렬한 배열의 0번부터 k번(원하던 개수)까지 슬라이스한다 .slice(0, k) // 자주사용된 k개의 배열을 map으로 반복시켜 기존 객체의 키 값(배열의 첫번째 값)을 가져와서 리턴한다. .map((el) => Number(el[0])) ); }
sort 메서드를 통해 배열을 정렬 시킬 수 있다. 추가적으로 함수를 통해 조건을 적용할 수 있다.
function topK(nums, k) { let arr = []; let obj = {}; nums.forEach((i) => { if (obj[i]) { obj[i]++; } else { obj[i] = 1; } }); for (let j in obj) { arr.push([j, obj[j]]); } return arr .sort((a, b) => b[1] - a[1]) .slice(0, k) .map((el) => Number(el[0])); }
와 진수님 설명 너무 꼼꼼해요!!!!!