숫자로 이루어진 배열인 nums를 인자로 전달합니다. 숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.
예를 들어,
nums = [3,2,3] return 3 nums = [2,2,1,1,1,2,2] return 2
nums 배열의 길이는 무조건 2개 이상
function moreThanHalf(nums) {
if (nums.length >= 2) {
const major = {}
nums.filter((el, index) => {
major[el] = (major[el])? (major[el]+1) : 1;
});
return major
} else {
return 0;
}
}
major[el] = (major[el])? (major[el]+1) : 0;
처음에는 이런 식으로 풀었는데 이렇게 한다면 계속 0이 나오기 때문에 true일 때의 식이 평생 실행되지 않게된다.function moreThanHalf(nums) {
if (nums.length >= 2) {
const major = {}
nums.filter((el, index) => {
major[el] = (major[el])? (major[el]+1) : 1;
});
const keys = Object.keys(major);
const values = Object.values(major);
const maxValues = Math.max(...values);
for (let i in keys) {
if (major[keys[i]] === maxValues) {
return keys[i];
}
}
}else{
return 0;
}
}
코드 리뷰로 추가로 알게 된 사실이 있다.
nums.filter((el, index) => {
major[el] = (major[el])? (major[el]+1) : 1;
});
나는 위와 같이 이렇게 삼항 연산자를 사용하여 value 값을 결정하였는데 이것을 더 간단하게도 표현할 수 있다.
nums.filter((el, index) => {
major[el] = (major[el] || 0) + 1;
});
이 식도 내가 처음에 작성한 코드와 똑같이 동작된다.
major[el] 값이 없다면 0으로 시작하여 같은 값을 만나면 +1씩 증가시킨다.