[Code Kata] JavaScript #7

ojae kwon·2021년 5월 5일
  1. 문제

    • 숫자로 이루어진 배열인 nums를 인자로 전달합니다. 숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환하시오.

  1. 문제 해결 방법 구상

    1) 인자로 받은 배열을 오름차순으로 정렬하여, 같은 숫자의 마지막 index - 처음 index + 1 로 각 숫자의 개수를 구하여 이중 과반이 넘는 수가있으면 그 수를 리턴하도록 구상

    2) 정렬을 위해 sort(), 비교를 위한 중복값 삭제를 위해 new Set() 을 사용.


3. 코드 작성
function moreThanHalf(nums) {
  const sorted = nums.sort((a,b)=> a-b)					// 받은 인자를 정렬 sort 메소드 안에 (a,b)=> a-b 이
									   들어가야 일반적인 오름차순으로 정렬됨 안넣으면 ASCII 순으로 정렬
  const set = new Set(sorted)						// 중복값 삭제
  let indexMax = 0

  for(let i of set){
    let candidate = (sorted.lastIndexOf(i) - sorted.indexOf(i) +1)	// 각 숫자별 갯수를 저장할 변수 candidate 선언 및 할당
    if (candidate>nums.length/2) {					// 숫자의 갯수가 과반(인자길이의 절반 초과)
      indexMax = i							// 과반인 수를 indexMax 에 할당
    }
  }
  return indexMax
}

  1. 다른 방법
function moreThanHalf(nums) {
   let countNumber = {}						// '각 숫자 : 개수' 형태의 값을 담을 객체 생성

   for (let i of nums) {
     countNumber[i] ? countNumber[i] += 1 : countNumber[i] = 1	// 각 숫자를 키 값으로 하는 객체가 있으면 값을 +1 시켜주고, 없으면 값을 1로 하여 새로운 키를 생성하는 삼항연산자
   }
   for (let i in countNumber) {
     if (countNumber[i] > nums.length/2) {			// 객체의 값 중에서 과반이 있는지를 확인
       return Number(i)						// 객체의 키값은 문자열이므로 숫자로 바꿔서 리턴
     }
   }
 }

  1. 작성 후 느낀점

    1) 배열 메소드인 sort() 는 자주 쓸일이 있을 것 같아 확실히 알고 넘어가야 할 것 같고, new Set() 으로 객체를 생성한 것도 좋은 방법 이라고 생각했는데, 삼항연산자를 통해 새로운 객체를 생성하고 값을 쉽게 조정 하는 방법은 누가 알려주기 전까진 나는 생각해내지 못했을 것 같은 방법이라 이런식의 접근법도 잘 숙지해야 할 것 같다.

0개의 댓글