다차원 배열을 1차원 배열로

개발(공부) 자국·2021년 5월 22일
0

요즘 들어 제대로 이해하고 있는게 있나 싶을 정도로

공부할때 마다 지난 개념 부분이 부족하거나 잘못되어 있는 것을 발견하게 된다.

재귀의 개념이 잘 안잡힌것 같은 느낌이 들었다.

다시 공부하면서 전보다는 더 가깝게 이해한 것 같았다.

다차원 배열을 1차원 배열로 재귀를 이용해서 만들어 보려고 한다.

물론 flat(); 의 아주 좋은 메소드가 있지만 flat();은 사용하지 않고

재귀를 연습한다고 생각하고 해봤다.

여러 방법이 있겠지만 헷갈렸던 선언한 빈 배열에 추가하는 방법을 연습해봤다.

재귀할때마다 함수 안에 선언된 빈 배열이 나와서 머리 속으로 잘 상상이 되지 않았었다.

let numberArr = [1,2,[3,4,[5,6,[7,[8,[9]]]]]];

function arrayFlat (arr) {
  const pressed = [];
    for (let i = 0; i < arr.length; i++) {
      if (Array.isArray(arr[i])) {	 // 요소가 배열이라면
   ->   const press = arrayFlat(arr[i]); // 요소를 재귀한 결과를 변수에 담는다.
   ->   pressed.push(...press);          // 변수에 담긴 배열을 배열에 푸쉬한다.
      }
      else {
        pressed.push(arr[i]);	   	// 배열이 아니라면 그 요소를 배열에 푸쉬한다.
      }
    }
  return pressed;
}

arrayFlat(numberArr); // [1,2,3,4,5,6,7,8,9]

어려웠던 부분은 화살표 부분이다.

저 부분을 한번 써보면서 표현을 해보니 이런 표현이 되었다.

arr0 = [1,2,[3,4,[5,6,[7,[8,[9]]]]]]; 	// 배열을 받았다.
pressed0 = [];				// 초기는 없는 상태에서 
->       = [1,2];			// 배열이 아니면 푸쉬하다가 3부터 있는 배열 arr[2]를 만났다.
               				// 그럼 그 배열 arr[2]를 재귀함수의 인자로 넣어 호출하면
arr1 = [3,4,[5,6,[7,[8,[9]]]]];		// 3부터 시작하는 arr[2]가 arr1이 된다.
pressed1 = [];				// 이 함수의 pressed는 아직 없는 상태다.
-> 	 = [3,4];			// 3부터 푸쉬하다가 5부터 시작하는 배열 arr[2]를 만난다.
					// 재귀함수의 인자로 호출하면 
arr2 = [5,6,[7,[8,[9]]]];		// 점점 더 작은 단위로 가게 된다.
pressed2 = [];
-> 	 = [5,6];

arr3 = [7,[8,[9]]];
pressed3 = [];
-> 	 = [7];

arr4 = [8,[9]];
pressed4 = [];
-> 	 = [8];

arr5 = [9];		// 마지막에 더 이상 배열이 존재하지 않을때 재귀의 끝에서부터 리턴이되면서 올라온다. 
pressed5 = [];		// const press = arrayFlat(arr[i]); 이 할당으로  
-> 	 = [9];		// 9를 푸쉬한 pressed5가 리턴되어 press4가 된다
			// pressed4.push(...press4); [8].push(...[9])가 되는 셈이다.  
			// 그렇게 pressed4 = [8,9]가 리턴 되고 그 값은 다시 press3이 된다.
			// pressed3.push(...press3); [7].push(...[8,9]) 가 되고
			// pressed2.push(...press2); [5,6].push(...[7,8,9])
			// pressed1.push(...press1); [3,4].push(...[5,6,7,8,9])
			// pressed0.push(...press0); [1,2].push(...[3,4,5,6,7,8,9])
			// pressed0 = [1,2,3,4,5,6,7,8,9] 가 된다.

저렇게 그려보니 어떤 느낌인지 알것 같았다.

flat();을 사용하면 어떤 방향이 될지 한번 해봤더니 이런 방식이 되었다.

let numberArr = [1,2,[3,4,[5,6,[7,[8,[9]]]]]];
function flatAr (arr) {
    let result = arr.slice();
    for (let i = 0; i < result.length; i++) {
        if (Array.isArray(result[i])) {
            result = result.flat();
        }
    }
    return result;
}
          
flatAr(numberArr); // [1,2,3,4,5,6,7,8,9]

배열을 만나면 한번씩 함수를 사용하는 방식으로 작성해봤다.

편하긴 해도 재귀를 연습을 많이 해야겠다.

아직 공부하는 중이라서 부족한 점이 많습니다.

잘못된 부분 언제든 피드백 주시면 감사하겠습니다.

profile
기록을 중요하게 생각하는 사람입니다. 학습한 내용을 정리한 것이라 잘못된 정보가 있을 수 있습니다. 잘못된 정보는 언제든 말씀해 주시기 바랍니다.

0개의 댓글