배열의 length 속성에 접근하지 않고, 어떠한 내장 반복문도 사용하지 않은 채 배열의 가운데 요소를 반환하는 함수 findMiddle을 작성해야 합니다. 배열의 요소 개수가 홀수라면 가장 중앙에 있는 하나의 요소를 반환하고, 짝수라면 중앙에 위치한 두 개의 요소를 담은 배열을 반환해야 합니다.
접근 방식: 재귀를 활용한 구현
이 문제는 재귀(recursion)를 활용하면 깔끔하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.
- 인덱스를 0부터 시작해 재귀 호출마다 1씩 증가시키며 배열을 순회합니다.
- 현재 인덱스에 해당하는 요소가 존재하지 않으면(즉, 배열의 끝에 도달하면) 재귀를 종료합니다.
- 이 시점의 인덱스 값이 곧 배열의 실제 길이가 되므로, 이 값을 이용해 중앙 요소의 위치를 계산합니다.
코드 예제
const arr = [1, 2, 3, 4, 5, 6, 7];
const array = [1, 2, 3, 4, 5, 6, 7, 8];
const findMiddle = (arr, ind = 0) => {
if(arr[ind]){
return findMiddle(arr, ++ind);
};
return ind % 2 !== 0
? [arr[(ind-1) / 2]]
: [arr[(ind/2)-1], arr[ind/2]];
};
console.log(findMiddle(arr));
console.log(findMiddle(array));코드 동작 원리
- 재귀 순회:
findMiddle함수는 두 번째 매개변수ind(기본값 0)를 받아 현재 인덱스의 요소가 존재하는 동안 자기 자신을 호출하며 인덱스를 증가시킵니다. - 종료 조건:
arr[ind]가undefined가 되는 순간, 즉 배열의 끝에 도달하면 재귀가 멈춥니다. 이때의ind값이 배열의 전체 길이입니다. - 중앙 요소 계산: 길이가 홀수(
ind % 2 !== 0)라면 정확히 하나의 중앙 요소를, 짝수라면 중앙에 인접한 두 요소를 배열로 감싸 반환합니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
[ 4 ] [ 4, 5 ]
7개의 요소를 가진 첫 번째 배열에서는 네 번째 요소인 4가, 8개의 요소를 가진 두 번째 배열에서는 중앙의 두 요소인 4와 5가 각각 반환된 것을 확인할 수 있습니다.
마무리
이처럼 재귀를 활용하면 length 속성이나 for, while 같은 반복문 없이도 배열의 중앙 요소를 우아하게 찾아낼 수 있습니다. 다만 배열의 크기가 매우 클 경우 재귀 호출 스택이 깊어질 수 있으므로, 실무에서는 이 점을 고려해 적절히 활용하는 것이 좋습니다.