그때 그 시절 기억하고 싶어서 적는 글입니다. 오늘도 지민님께서 도와주셨어요. 저는 문제풀이 원리를 알겠는데요. 구현을 하기가 너무 어려워요 ㅠ.ㅠ
먼저 문제로는
nums = [3,2,3]
return 3이 되어야 하고
nums = [2,2,1,1,1,2,2]
return 2이 되야 합니다.
function moreThanHalf(nums) {
시작을 해볼께요. 먼저 배열인 nums가 [3,2,3]이라고 가정하에 배열의 길이는 3이라는것을 알수 있습니다.
그리고 과반수가 무엇일까요?? 반이 넘는수를 칭합니다.
그렇다면 배열의 길이 3에서 반이 넘는수가 무엇일까요??? 1.5보다 큰 수를 말하겠죠??
다른 예시로 배열의 길이가 4라면??? 2 보다 큰수/ 배열의 길이가 7이라면 3.5보다 큰수를 말합니다.
여기서 [3,2,3]에서 3이라는 요소가 2개가 있고 2라는 요소가 1개가 있습니다.
[3,2,3]에서 배열의 길이가 3이고 과반수는 1.5입니다.
1.5보다 넘는 수는 무엇일까요?? 3이라는 요소가 2개가 있기 때문에 해당이 되겠죠?? 그럼
리턴값이 3입니다.
다른 예시로 [2,2,1,1,1,2,2]가 있다고 가정해볼께요. 배열의 길이는 7이고 과반수는 3.5보다 커야합니다. 여기서 배열안에 있는 2가 총 4개가 있고 [2,2,2,2] 1이 [1,1,1]3개가 있다고 생각할수 있습니다.
그럼 과반수는 3.5이기때문에 2라는 숫자가 4개가 있어서 해당되겠죠?? 그럼 리턴값은 2입니다.
이제 문제원리를 알게 되었어요. 이걸 어떻게 구현을 해야할까요???
다시한번 지민님에게 감사함을 느낍니다.
먼저 과반수를 변수로 주고 잡아보겠습니다
let halfArr = nums.length / 2 이라고 표현이 가능하겠죠??
halfArr이라는 변수사 nums의 배결길이가 과반수라는 표현을 나누기 2로 표현했어요. 그래서
halfArr이 과반수니깐 배열의 길이가 3이라면 1.5라고 알수 있습니다.
그래서 for문을 이용해서 for(let i =o; 이고 i가 nums의 배열길이보다 커야하고 1씩 증가한다고 생각한다면
for(let i =o; i <nums.length; i++)이 되는데요.
여기서 if문을 이용해서 만약에 if(nums.filter 매소드를 이용한다면 if(nums.filter(x로 x는 배열이 [3,2,3] 안에 있는 3,2,3을 뜻하는데요.
x가 === nums.length[i]같다고 한다면 x === nums[i]).length은 [3,2,3]이고 x는 3이면 3자리를 찾아야하니까 [3,3]과 [2]가 나오게 됩니다. 근데 여기서
아까 변수를 줬던 let halfArr이 배열의 길이 과반수 이니깐 if (nums.filter(x => x === nums[i]).length > halfArr)이 되는데요.
1.5보다 큰 [3,3]이 배열의 길이가 2이니깐 큽니다.
그래서 리턴값은 2로 나오고
다른 예시로 [2,2,1,1,1,2,2]라고 한다면 x === nums[i]).length에서 x는 [2,2,2,2] , [1,1,1]이 됩니다. 그래서 [2,2,1,1,1,2,2] 배열의 길이 과반수는 7이고 과반수는 3.5이고
[2,2,2,2]는 배열의길이가 4이니까 과반수보다 큰 수에 해당 됩니다. 그래서 리턴값은 2가 되겠네요.
다시 한번 구현을 도와주신 지민님에게 감사함을 느낍니다.
정리를 하자면 ~~~
function moreThanHalf(nums) {
let halfArr = nums.length / 2
for (let i = 0; i < nums.length; i++){
if (nums.filter(x => x === nums[i]).length > halfArr) {
return nums[i]
}
}
}
console.log(moreThanHalf([3,2,3]));
값은 3이 되겠네요.