TIL _ Code Kata _ 배열 내 과반수를 차지하는 숫자 찾기

옥원철·2021년 10월 27일
0

Javascript

목록 보기
14/17
post-thumbnail
post-custom-banner

❓문제

  • 주어진 배열에서 과반수를 차지하는 숫자를 찾아서 반환하는 로직 구현
  • 예를 들어,
    [1, 1, 2, 2, 2] 의 경우 2를 반환
    [4, 3, 4, 4, 4, 1] 의 경우 4를 반환
function moreThanHalf (nums) { };


1. 해결 방안

  • 사고 과정

🔓 (문제 파악) 주어진 배열 내에 중복되는 요소들의 숫자를 파악해야한다.
🔑 (해결 방안)

  1. 새로운 객체를 선언하고, 배열 내 각 요소들을 순회하며(forEach) 새 객체의 key로 할당한다.
    2-1. 이때, key를 최초로 할당하는 경우에는 해당 key의 value는 1을 부여한다.
    2-2. key가 이미 할당되어 있는 경우에는 해당 key의 value에 1을 더해준다.
    (중복 요소의 갯수를 파악하기 위함)
let numOfSameEl = {};

function moreThanHalf (nums) {
  nums.forEach((x) => {
    numOfSameEl[x] = (numOfSameEl[x] || 0) + 1; 
    // key           // value
  });
}




🔓 (문제 파악) 과반수가 넘는 숫자를 반환한다.
🔑 (해결 방안) 과반수가 넘는지 확인하기 위하여

  1. numOfSameEl 객체의 모든 value 값을 더하여
  2. 해당 합계의 절반을 초과하는(과반수) value를 찾아 해당 value의 key를 숫자로 반환한다.
function moreThanHalf(nums) {
  let numOfSameEl = {};  
  nums.forEach((x) => {
    numOfSameEl[x] = (numOfSameEl[x] || 0) + 1;
  });

  let sum = 0;
  let result;
  for (el in numOfSameEl) { // for...in 반복문을 통해 객체의 key에 접근
    sum += numOfSameEl[el]; // 객체의 모든 value를 합산한 뒤,
    if (numOfSameEl[el] > sum * 0.5) { // sum의 절반을 초과하는 value를 반환
      result = Number(el);
    }
  }

  return result;
}



2. 결과


function moreThanHalf(nums) {
  let numOfSameEl = {};  
  nums.forEach((x) => {
    numOfSameEl[x] = (numOfSameEl[x] || 0) + 1;
  });

  let sum = 0;
  let result;
  for (el in numOfSameEl) { 
    sum += numOfSameEl[el]; 
    if (numOfSameEl[el] > sum * 0.5) { 
      result = Number(el);
    }
  }

  return result;
}

const arr = [2, 2, 1, 1, 1, 2, 2];
console.log(moreThanHalf(arr)); // 2



"작성 내용 중 오류나 오타가 있다면, 댓글로 알려주시면 감사하겠습니다. 주니어 개발자에게 남겨주시는 작은 피드백이 큰 도움이 될 것 같습니다. 고맙습니다 :)"

profile
Obtainment Of The Day
post-custom-banner

0개의 댓글