[algorithm-1]

🍉effy·2022년 1월 20일

배열에서 가장 많이 중복되는 숫자 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번 들어가있다는 가정 하)

  • 이런 식으로 객체 안에 배열 속의 숫자가 key 로 분류되어 있고, value 로 그 숫자의 개수가 출력

	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)

  • keys 의 value 값을 비교하여 내림차순 정렬은 sort() method 를 사용.
  • sort(function(a, b) 에서 a 는 뒷자리, b 는 앞자리
  • 내림차순 정렬을 위해 b - a 로 비교
    (내림차순으로 정렬해야 개수가 제일 많은 숫자들을 골라낼 수 있다)

5️⃣ sorted 를 콘솔에 찍어보면 => ['2', '1', '3' ]

  • Object 의 keys 가 value 값이 가장 높은 순서대로 배열된다.

	return sorted.slice(0, k).map(x => Number(x))
 }
topK([1, 1, 2, 2, 2, 3], 2)

6️⃣ k 수가 2 라고 할 때, 배열 중 2개 만을 가져와야 하기 때문에 slice() 함수를 사용

  • slice (a, b) 에서 a 는 시작점, b 는 마무리지점

7️⃣ 하지만 배열 속 값은 string 형태이기 때문에 숫자로 다시 재배열

  • (x => Number(x)) 배열의 요소를 Number () method 로 string 형태의 요소를 number 형태로 바꿔줌
  • map () 함수로 재배열
  • 🔹 [ 2, 1] 출력 ( nums 배열 중 가장 많이 들어있는 숫자 2개 (k) 출려억 )
profile
Je vais l'essayer

0개의 댓글