Algorithm - CodeKata #07

Sangho Moon·2020년 9월 8일
0

Algorithm

목록 보기
18/37
post-thumbnail

1. Question

숫자로 이루어진 배열인 nums를 인자로 전달합니다.
숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.

예를 들어,

nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2

가정
nums 배열의 길이는 무조건 2개 이상


2. Try & Answer

function moreThanHalf(nums) {
  nums.sort();
  
  const length = nums.length;
  
  if (length % 2 === 0) {
    return nums[length / 2]
  } else {
    return nums[(length - 1) / 2]
  }
}

const result = moreThanHalf([2,2,1,1,1,2,2]);

console.log(result); // 2

문제에서 요구한 것은 배열의 요소 중 과반수를 넘는 요소를 출력하라는 것이다.

그렇다면 무작위로 나열되어 있는 배열을 정렬한 뒤에,

그 배열의 length를 구하고,

length를 2로 나누었을 때 나머지가 0인 경우와 그렇지 않은 경우를 구분하여 출력하면 된다.

2로 나누었을 때 나머지가 0이라는 것은 배열이 짝수개 라는 뜻이다.

여기서 나머지가 0일 때 nums[length/2] 를 출력하면 배열 요소 중 절반에서 바로 그 다음 요소가

출력된다.

만약 나머지가 1이라면 배열이 홀수개 라는 뜻이다.

여기서 나머지가 1일 때 nums[(length - 1) / 2]를 하면 배열 요소 중 정중앙에 있는 요소가 출력된다.

결국 배열이 짝수든, 홀수든 과반수인 요소를 출력할 수 있게 된다.

앞에서 sort( ) 메서드로 배열을 미리 정렬해두었기 때문에 쓸 수 있는 방법이다.

위에서 적용한 배열을 예로 들어보자.

  1. 먼저 nums.sort()로 인자로 넘겨받은 배열을 정렬한다.

  2. 배열을 정렬하면 [ 1, 1, 1, 2, 2, 2, 2 ] 가 된다.

  3. 이 배열의 legnth는 7이다.

  4. 7 / 2 의 나머지는 1이므로 if else 문에서 else에 해당된다.

  5. nums[(length - 1) / 2] 는 nums[3]이다.

  6. nums[3]은 2이므로 결과적으로 2가 출력된다.

profile
Front-end developer

0개의 댓글