재귀 15번 flattenArr

Judo·2020년 11월 18일
1
post-thumbnail

문제

다차원 배열을 입력받아 1차원 배열로 변환하여 리턴해야 합니다.


입력

arr

  • 양의 정수 또는 배열을 요소로 갖는 다차원 배열

출력

  • 배열을 리턴

내가 쓴 코드

function flattenArr(arr) {
  // TODO: 여기에 코드를 작성합니다.
   /**
   * 1.재귀 함수의 입력값과 출력값 정의하기
   *  - flatternArr : [num or []] => []
   * 2.문제를 쪼개고 경우의 수를 나누기
   *  - 더 이상 쪼갤 수 없는 경우 : 빈 배열을 입력받은 경우 -> 빈 배열 리턴 
   *  - 그렇지 않은 경우 :  
   * 3.단순한 문제 해결하기 (base case)
   *  - [[], ?, [], [[]], []]
   * 4.복잡한 문제 해결하기
   * 5.코드 구현하기
   *  
   * 
   *  주어진 문제가 (구조는 비슷하고) 더 작은 문제로 나뉘어 질 수 있는 경우
      중첩된 루프가 많거나 중첩의 정도(number of loops)를 미리 알 수 없는 경우

      배열이 아닌 숫자를 만났을 경우 -> result.push(arr[i])
   */
  
    if (arr.length === 0) {
      return [];
    }
    let result = [];
    for (let i = 0; i < arr.length; i++) {
      
      if (Array.isArray(arr[i])) {
        let a = flattenArr(arr[i]); //[1]
        result.push(...a);
      } else {    
        result.push(arr[i]);
      }
    }
    return result;
}

어려웠던 점

  1. 배열의 요소가 배열인 경우 재귀 호출을 한 결과를 새로운 배열로 담아 리턴하는 방법을 해결하지 못했다.
  2. if (Array.isArray(arr[i])) {
            let a = flattenArr(arr[i]); //[1]
            result.concat(a);
          } else {    
            result.push(arr[i]);
          }
    처음에 작성한 코드는 위와 같았다. 재귀 호출을 통해 얻은 배열을 기존 result배열과 concat()으로 합쳐줄 생각이었다. 하지만 위와 같이 작성하면 다차원 배열안에 있는 수를 읽어오지 못했고 현재 질문을 올려둔 상태다. 이후 답변을 통해 오류를 찾고 추가적으로 적겠다.
profile
즐거운 코딩

0개의 댓글