배열에서 가장 많이 중복되는 숫자 n개 만큼 return
- 빈 객체 사용
- for in 문 사용
- sort() method 와 slice(), map() 함수 사용
function topK (nums, k) { let obj = {} for (let i in nums) { nums[i] in obj ? obj[num[i]] += 1 : obj[num[i]] = 1 } console.log(obj)
1️⃣ 배열에서 같은 숫자, 같은 글자 등 같은 요소의 개수를 서로 비교할 때 빈 객체를 사용. obj 를 빈 객체로 선언
2️⃣ nums 이라는 배열 안의 요소를 for in 문을 돌린다.
nums[i] in obj ? nums 안의 요소가 obj 즉 빈 객체 안에 key 값으로 들어있는가? obj[num[i]] += 1 obj 객체 안에 있다면 value 를 1 늘려주고 obj[num[i]] = 1 obj 객체 안에 없다면 빈 객체 key 로 넣어주고 value = 1 3️⃣ obj 를 콘솔에 찍어보면 => { '1' : 2, '2' : 3, '3' : 1 }
(nums [] 안에 1 이 2번, 2가 3번, 3이 1번 들어가있다는 가정 하)
let sorted = Object.keys(obj).sort(function(a, b) { return obj[b] - obj[a] }) console.log(sorted);
4️⃣ 이 객체를 가지고 key의 value 값을 비교 하며, keys 를 내림차순 정렬을 해준다. 여기서 나는 가장 많이 중복되는 숫자를 k 수만큼 가져올거기 때문에 keys 를 출력해야함 Object.keys(obj)
5️⃣ sorted 를 콘솔에 찍어보면 => ['2', '1', '3' ]
return sorted.slice(0, k).map(x => Number(x)) } topK([1, 1, 2, 2, 2, 3], 2)
6️⃣ k 수가 2 라고 할 때, 배열 중 2개 만을 가져와야 하기 때문에 slice() 함수를 사용
7️⃣ 하지만 배열 속 값은 string 형태이기 때문에 숫자로 다시 재배열
(x => Number(x)) 배열의 요소를 Number () method 로 string 형태의 요소를 number 형태로 바꿔줌[ 2, 1] 출력 ( nums 배열 중 가장 많이 들어있는 숫자 2개 (k) 출려억 )