숫자로 이루어진 배열인 nums를 인자로 전달합니다. 숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.
예를 들어,
nums = [3,2,3]
return 3
nums = [2,2,1,1,1,2,2]
return 2
nums = [3,2,3]
return 3
nums = [2,2,1,1,1,2,2]
return 2가정 nums 배열의 길이는 무조건 2개 이상
일주일넘게 코드카타를 하는 동안 깨달은게 있으니... 문제에 접근을 생각보다 단순하게 하면 편하다는 것이었다. 그래서 이번 문제는 가장 쉽게 접근하기로 마음먹고 골똘히 생각했당...
그래서 낸 해결책은 아래와 같다.
1. 어차피 과반이 넘어야 한다면 배열의 중간값이 무조건 과반인 수가 되겠군.
2. 그렇다면 배열을 sorting하고 배열길이의 반을 구해 그걸 인덱스로 과반인 수를 찾으면 되겠군.
끝이다.💁(별로 자랑스럽진않닼ㅋㅋㅋㅋㅋㅋ)
그래서 내 코드는 아래와 같았다.
function moreThanHalf(nums) {
let newArr = nums.sort();
let i = Math.floor(newArr.length/2)
return newArr[i]
}
놀랍게도 테스트는 통과되었다.
그런데 정훈님이 찾아준 문제가, 만약 숫자가 3가지 이상이고 1,1,1,2,3,4,5,6,7과 같이 있으면 그 중간값이 꼭 과반인 수가 되지 않는다는 것이었다. 그런데 나는 문제에 충실해서 "more than a half"인 수를 찾기로 했다...^^
는 개발자다운 생각이 아니니 다른 해결책도 찾아보았다.
var majorityElement = function(nums) {
let res = 0, count = 0;
for (let num of nums) {
if (count === 0) {
res = num;
count++;
} else {
(num === res) ? count++ : count--;
}
}
return res;
};
이 방법은 res와 num을 비교해서 같으면 카운트를 늘려주고 다르면 카운트를 빼주어 결국 더 많은 숫자가 리턴될 수 있도록 하는 건데....생각해낸 사람 천재같다;;; 이걸 어떻게 생각해내지;;;; 하여간 여기서 쓰인 for of문에 대해서 정리해봤다!