[CodeKata] 과반수가 넘은 숫자

혜린·2022년 9월 6일
1
post-thumbnail

문제


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

입출력 예제

numsreturn
[3,2,3]3
[2,2,1,1,1,2,2]2

제한사항

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



풀이


🌊 생각의 흐름

배열에 들어와있는 숫자 중 과반수가 넘는 숫자를 반환하면 되기 때문에, 우선 정렬을 해줘야한다고 생각했어요. 그러면 숫자별로 세어주기가 편하니까요!

정렬이 끝나면 숫자별로 몇 개가 있는지 차례로 세어줄 수 있겠죠? 가장 많이 나온 숫자로 계속 갱신해주면 되구요!


✨ 나의 풀이

function moreThanHalf(nums) {
  nums = nums.sort(); // 오름차순 정렬 
  
  let length = 0; 
  let maxLength = 0; 
  let majorityNum = nums[0];
  
  for(let i = 0; i < nums.length; i++){
    length++;
    if(nums[i] !== nums[i+1]){ // 내 뒤에 다른 숫자가 있을 경우
      if(maxLength < length){ // 지금까지 센 길이와 최대 길이 비교
        maxLength = length;
        majorityNum = nums[i]
      } 
      length = 0;
    }
  }
  
  return majorityNum;
}

📝 풀이 과정

[3,2,3]라는 배열이 들어왔다고 생각하고 풀이 과정 설명해볼게요.

  1. sort()를 사용해 오름차순 정렬로 [2,3,3]을 만듭니다.

  2. 변수length는 숫자별 길이를 담을 임시 공간이고, 변수maxLength는 가장 많이 나온 숫자의 갯수를 담을 공간이에요.

  3. 숫자별로 몇 개 있는지 세기
    ✔ for문으로 숫자 하나씩 돌때마다 length를 하나씩 증가시켜 숫자가 몇 개 있는지 세어줄 수 있어요.
    ✔ 2는 하나뿐이기 때문에 저장한 2의 길이인 변수length는 1이 되죠.
    ✔ 2에서 3으로 넘어가는 것과 같이 숫자가 바뀔 때는 한 가지 검사를 해줘요. 현재까지 더한 length가 최대길이인지 확인하는 검사랍니다! 이 때, 최대 길이라면 maxLengthlength값을 할당해주고 length를 0으로 초기화시켜줍니다(다음 숫자를 세어주기 위함). 그리고 return할 majorityNum을 현재 숫자로 바꾸죠.
    ✔ 최대길이가 아니라면 length는 0으로 초기화시켜주고 다음 숫자를 또 하나씩 더해나갑니다.
profile
FE Developer

0개의 댓글