Code Kata Day 7

SYhwang·2023년 1월 31일
0

코드카타

목록 보기
7/10

문제

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

예를 들어,

nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2

가정

nums 배열의 길이는 무조건 2개 이상

풀이

풀이 1

function moreThanHalf(nums) {
    return nums.sort((a,b)=>a-b)[Math.floor(nums.length/2)]
  }
  • 발상 : 배열 내의 요소들을 숫자 크기대로 정렬시 과반수가 넘는 갯수의 요소는 중앙에 위치할 것이라는 생각으로 접근했다.
    Math.floor(nums.length/2)로 중앙의 인덱스를 구한 뒤 nums.sort로 정렬한 nums 안에서 중간에 있는 값을 리턴한다.

풀이 2

function moreThanHalf(nums) {
  let numsObj = {}
  for(i=0; i<nums.length; i++) {
    if(numsObj[nums[i]]) {
        numsObj[nums[i]] +=1

    } else {
      numsObj[nums[i]] = 0 + 1
    }
  }
  const maxVal = Math.max(...Object.values(numsObj))

  return Number(Object.keys(numsObj).find(key => numsObj[key] === maxVal))
}
  • 발상 : nums의 요소를 순회하며 각 숫자의 개수를 센다. 그리고 각 수를 key로, 해당 수의 배열 안의 갯수를 value로 가진 numsObj 객체를 만드는 방향으로 접근했다.
    (예 : nums=[1,1,1,1,2,2,2]일 때 numsObj= {1:4, 2:3} )
  • 객체 안에 해당 키가 존재하지 않을 때 1을 더하면 undefined 오류가 나기에 if(numsObj[nums[i]])로 해당 키의 존재 여부를 확인하는 분기를 만들었으며, 존재하지 않으면 해당 키의 값을 0으로 선언해준 뒤 더한다.
  • 그 뒤 Object.values(numsObj)로 numsObj의 value 만 담긴 배열을 구하고, 거기에 Math.max를 이용해 가장 큰 값을 찾고 그 값을 maxVal에 저장한다.
  • Object.keys(numsObj) 와 .find를 이용해 maxVal을 value로 가진 key를 구하고, 객체의 key는 늘 string이므로 구한 key를 Number로 변환해 리턴한다.

0개의 댓글