JavaScript에서 임의의 깊이까지 중첩된 숫자 배열을 입력받아, 그 안에 있는 가장 큰 수를 반환하는 간단한 함수를 작성해 보겠습니다.
문제 정의
예를 들어 다음과 같은 입력 배열이 주어졌다고 가정해 봅시다.
const arr = [
34, 65, 67,
[
43, 76, 87, 23, 56, 7,
[
54, 7, 87, 23, 79, 314, 2
],
54
], 54, 4, 2
];이 경우 기대하는 출력 결과는 다음과 같습니다.
314
배열이 몇 단계든 중첩될 수 있으므로, 반복문만으로는 처리하기 어렵습니다. 이럴 때 재귀(recursion)를 사용하면 배열 안의 배열을 끝까지 탐색하며 최댓값을 찾을 수 있습니다.
구현 예제
배열의 각 요소를 순회하면서 요소가 배열이면 자기 자신을 다시 호출하고, 그렇지 않으면 현재까지의 최댓값과 비교하는 방식으로 구현합니다.
const arr = [
34, 65, 67,
[
43, 76, 87, 23, 56, 7,
[
54, 7, 87, 23, 79, 314, 2
],
54
], 54, 4, 2
];
const findGreatest = (arr, greatest = -Infinity) => {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
// 중첩 배열이면 재귀 호출하여 결과를 최댓값에 반영
greatest = findGreatest(arr[i], greatest);
} else if (arr[i] > greatest) {
greatest = arr[i];
}
}
return greatest;
};
console.log(findGreatest(arr)); // 314코드 설명
- 기본값
-Infinity: 초기 최댓값을 음의 무한대로 설정하면 어떤 숫자와 비교해도 항상 올바르게 갱신됩니다. - 배열 판별:
Array.isArray()로 요소가 배열인지 확인한 뒤, 배열이라면 같은 함수를 재귀적으로 호출해 내부 값을 모두 탐색합니다. - 결과 병합: 재귀 호출의 반환값을 현재
greatest에 다시 할당해야 중첩 배열 뒤에 위치한 더 큰 값도 놓치지 않고 비교할 수 있습니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
314
이처럼 재귀를 활용하면 중첩 깊이가 몇 단계든 상관없이 배열 전체를 탐색하며 최댓값을 안정적으로 구할 수 있습니다.