[Day 7] 과반수 넘는 숫자 구하기

누리·2022년 10월 24일
0

CodeKata

목록 보기
7/7

📅 22.10.13
📖 파트너 : 정관훈

문제설명 :
숫자로 이루어진 배열인 nums를 인자로 전달합니다.
숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.
가정 :
nums 배열의 길이는 무조건 2개 이상

예를 들어,
nums = [3,2,3]
return 3

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

1. 객체로 값 축적하기

숫자 배열로 받은 인자를 객체로 키값으로 저장하여 for문을 돌면서 그 갯수를 축적하여 key값을 반환하는 방법으로 생각했다

function moreThanHalf(nums) {
  obj = {};
  
  let count = 1;
  for(let i = 0; i < nums.length; i++){
    if(!obj[nums[i]]){
      obj[nums[i]] = 1;
    }else {
      obj[nums[i]] += count;
    }
  }
  
  let arr = [];
  for(let key in obj){
    arr.push(obj[key]);
  }

  let max =Math.max(...arr)
  const result = Object.keys(obj).find(key => obj[key] === max);
  return Number(result);
}

이 코드를 짤 때 유의해야 할 점은

  • 처음에 빈 객체를 만들고 for문을 돌면서 key value 값을 축적할때 먼저 (!obj[nums[i]]) 처음의 키값이 없을경우 value값을 설정을 해주어야 한다는 것이다
  • 원래는 바로 obj[num[i]] += count 로 축적하는 코드를 짰는데 value값이 증감이 되지 않아 무엇이 문제인지 파악하는데 시간이 많이 소요됐다
  • 그리고 객체를 완성하고 나서 value값이 가장 높은 값을 알아내 그 value값의 key값을 알아내는 것이 문제였는데
  • 빈 배열을 선언하고 위에서 만든 객체의 key를 순환하며 value값만이 담긴 배열로 만들었다
  • 그리고 전개연산자로 복사한 배열에서 최대값을 구해 변수에 담아서 그 최대값과 일치하는 key값을 .find 메서드로 찾아 결과로 반환한다

2. sort() 메서드 활용

원래 객체로 담는다는 방법을 생각하기 전에 sort 메서드를 생각했었는데 처음엔 숫자가 2가지만 있을때 이것을 사용할 수 있다고 생각했다. 과반수의 단어 의미를 정확히 이해하지 못했기 때문이다. 과반수란 전체의 반이 넘는 수를 의미하므로 몇가지의 수가 있던 배열길이의 반 보다 큰 수은 무조건 과반수인 숫자가 차지할 것이다

function moreThanHalf(nums) {
  const length = parseInt(nums.length/2);
  nums.sort();

  return nums[length]
}

이 코드를 짤 때 유의해야 할 점은

  • 배열의 길이의 반을 반환하여 그 길이를 인덱스로 사용하기 때문에
    parseInt를 써서 길이값을 정수로 반환하여 사용해야한다는 것이다
  • 과반수라는 단어의 의미를 정확히 이해하여 첫번째 코드 보다 훨씬더 간편하게 숫자를 도출할 수 있다
profile
프론트엔드 개발자

0개의 댓글