숫자로 이루어진 배열인 nums를 인자로 전달합니다. 숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.
nums | return |
---|---|
[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]
라는 배열이 들어왔다고 생각하고 풀이 과정 설명해볼게요.
sort()
를 사용해 오름차순 정렬로[2,3,3]
을 만듭니다.
- 변수
length
는 숫자별 길이를 담을 임시 공간이고, 변수maxLength
는 가장 많이 나온 숫자의 갯수를 담을 공간이에요.
- 숫자별로 몇 개 있는지 세기
✔ for문으로 숫자 하나씩 돌때마다length
를 하나씩 증가시켜 숫자가 몇 개 있는지 세어줄 수 있어요.
✔ 2는 하나뿐이기 때문에 저장한 2의 길이인 변수length
는 1이 되죠.
✔ 2에서 3으로 넘어가는 것과 같이 숫자가 바뀔 때는 한 가지 검사를 해줘요. 현재까지 더한length
가 최대길이인지 확인하는 검사랍니다! 이 때, 최대 길이라면maxLength
에length
값을 할당해주고length
를 0으로 초기화시켜줍니다(다음 숫자를 세어주기 위함). 그리고 return할majorityNum
을 현재 숫자로 바꾸죠.
✔ 최대길이가 아니라면length
는 0으로 초기화시켜주고 다음 숫자를 또 하나씩 더해나갑니다.