Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 배열의 중간 요소 찾기 – length 속성 없이 재귀로 구현하기

이번 글에서는 배열의 length 속성에 접근하지 않고, 내장 반복문(for, while 등)도 사용하지 않고 배열의 가장 중간에 있는 요소를 반환하는 함수 midElement()를 작성해 보겠습니다.

요구 사항은 다음과 같습니다.

  • 배열의 요소 개수가 홀수라면, 정확히 가운데 있는 요소 하나를 반환합니다.
  • 배열의 요소 개수가 짝수라면, 가운데 두 개의 요소를 담은 배열을 반환합니다.

핵심 아이디어는 인덱스를 하나씩 증가시키며 자기 자신을 호출하는 재귀(recursion)를 활용해 배열의 끝, 즉 유효하지 않은 인덱스에 도달할 때까지 탐색하는 것입니다. 이렇게 하면 length 속성을 참조하지 않고도 배열의 전체 크기를 알아낼 수 있습니다.

구현 예제

전체 코드는 다음과 같습니다.

const arr = [14, 32, 36, 42, 45, 66, 87];
const array = [13, 92, 83, 74, 55, 46, 74, 82];

const midElement = (arr, ind = 0) => {
  // 현재 인덱스에 요소가 존재하면 재귀 호출로 다음 인덱스를 확인
  if (arr[ind]) {
    return midElement(arr, ++ind);
  }
  // 요소 개수(ind)가 홀수면 중간 요소 하나, 짝수면 중간 요소 두 개를 반환
  return ind % 2 !== 0
    ? [arr[(ind - 1) / 2]]
    : [arr[(ind / 2) - 1], arr[ind / 2]];
};

console.log(midElement(arr));
console.log(midElement(array));

코드 동작 원리

midElement 함수는 기본값이 0인 인덱스 매개변수 ind를 받습니다.

  1. 재귀 탐색 단계: arr[ind]가 존재하는 한(즉, 해당 인덱스에 값이 있는 한), 인덱스를 1씩 증가시키며 자기 자신을 다시 호출합니다. 배열 범위를 벗어나면 arr[ind]undefined가 되므로 조건문이 거짓이 되어 재귀가 종료됩니다. 이 시점의 ind 값이 곧 배열의 실제 요소 개수입니다.
  2. 중간 요소 계산 단계: 요소 개수가 홀수라면 (ind - 1) / 2번째 인덱스의 요소 하나를 배열로 감싸 반환하고, 짝수라면 ind / 2 - 1번째와 ind / 2번째, 즉 가운데 두 요소를 배열로 묶어 반환합니다.

실행 결과

콘솔 출력 결과는 다음과 같습니다.

[ 42 ]
[ 74, 55 ]

첫 번째 배열 [14, 32, 36, 42, 45, 66, 87]은 요소가 7개(홀수)이므로 정확히 가운데인 42 하나가 반환되었고, 두 번째 배열 [13, 92, 83, 74, 55, 46, 74, 82]는 요소가 8개(짝수)이므로 가운데 두 요소인 7455가 배열 형태로 반환된 것을 확인할 수 있습니다.

마무리

이처럼 재귀 함수를 활용하면 length 속성이나 반복문 없이도 배열의 크기를 파악하고 중간 요소를 손쉽게 찾을 수 있습니다. 다만 배열의 길이가 매우 긴 경우에는 재귀 호출 깊이 제한(스택 오버플로우)에 유의해야 하며, 실무에서는 일반적으로 Math.floor(arr.length / 2) 방식이 더 효율적이라는 점도 함께 기억해 두면 좋습니다.