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

JavaScript로 중첩 배열을 재귀적으로 탐색하여 특정 항목의 개수 구하기

문제 정의

배열과 검색어(query)를 인자로 받아, 중첩 배열 전체를 재귀적으로 탐색한 뒤 해당 검색어가 등장하는 횟수를 반환하는 searchRecursively() 함수를 작성해야 합니다.

예를 들어 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.

const names = ["rakesh", ["kalicharan", "krishna", "rakesh", "james", ["michael", "nathan", "rakesh", "george"]]];

이 상태에서 아래와 같이 함수를 호출하면 −

searchRecursively(names, 'rakesh');

'rakesh'라는 이름이 배열 안에 총 3번 등장하기 때문에 결과값으로 3을 반환해야 합니다. 그럼 이 재귀 함수를 직접 구현해 보겠습니다.

재귀 함수 구현

구현의 핵심 로직은 다음과 같습니다.

  • 배열의 요소를 하나씩 순회하면서, 해당 요소가 배열인지 Array.isArray()로 확인합니다.
  • 요소가 배열이라면 같은 함수를 재귀적으로 호출하여 하위 배열을 계속 탐색합니다.
  • 일반 값이고 검색어와 일치하면 카운트를 1 증가시킵니다.
  • 모든 요소를 확인한 후에는 누적된 카운트를 최종적으로 반환합니다.

예제 코드

const names = ["rakesh", ["kalicharan", "krishna", "rakesh", "james",
["michael", "nathan", "rakesh", "george"]]];
const searchRecursively = (arr, query, count = 0, len = 0) => {
    if(len < arr.length){
        if(Array.isArray(arr[len])){
            return searchRecursively(arr[len], query, count, 0);
        };
        if(arr[len] === query){
            return searchRecursively(arr, query, ++count, ++len);
        };
        return searchRecursively(arr, query, count, ++len);
    };
    return count;
};
console.log(searchRecursively(names, "rakesh"));

코드 동작 원리

이 함수는 기본 매개변수(default parameter)를 활용해 누적 카운트(count)와 현재 인덱스(len)를 함께 추적합니다. 현재 요소가 배열이면 해당 하위 배열을 첫 번째 인덱스부터 다시 탐색하도록 재귀 호출을 수행하고, 일반 값이라면 검색어와 비교하여 일치할 경우 카운트를 증가시킨 뒤 인덱스를 하나 늘려 재귀 호출을 반복합니다. 배열의 끝에 도달하면 지금까지 누적된 카운트 값이 최종 결과로 반환됩니다.

실행 결과

콘솔에는 다음과 같은 결과가 출력됩니다.

3