Code Kata #7 배열에서 과반 넘는 숫자 찾기

Somi·2021년 6월 29일
0

CODE KATA

목록 보기
7/12
post-thumbnail

💁 문제분석

숫자로 이루어진 배열인 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문에 대해서 정리해봤다!

"for of" vs "for in"

for of

  • 반복 가능한 객체(array, map, set, string 등)에 대해 반복
  • 순서가 중요한 경우 for of를 사용한다.
  • 쉽게 말해서 object만 for in을 사용하고 나머지는 for of를 사용한다고 생각하면 된다.

for in

  • for in은 객체를 순회하는데 사용함
  • index순서가 중요한 array에 대해 반복하는데는 사용하지 않음

0개의 댓글

관련 채용 정보