문제 :중첩 배열에 접근하여 새로운 배열 추출
주의사항
- 함수 flattenArr는 재귀함수의 형태로 작성합니다.
- Array Method flat()과 flatMap() 사용은 금지됩니다.
- 반복문(for, while) 사용이 가능합니다.
- 입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
- 입력으로 전달되는 다차원 배열이 중첩된 정도(중첩의 깊이)는 정해져 있지 않습니다.
- 빈 배열을 입력받은 경우, 빈 배열을 리턴해야 합니다.
입출력 예시
let output = flattenArr([[1], 2, [3, 4], 5]); console.log(output); // --> [1, 2, 3, 4, 5] output = flattenArr([[2, [[3]]], 4, [[[5]]]); console.log(output); // --> [2, 3, 4, 5]
알고리즘
function flattenArr(arr) { //[1]
// TODO: 여기에 코드를 작성합니다.
let newarr=[]
if(arr.length===0){
return []
}
//1. 요소를 돌자.
for(let i=0; i<arr.length; i++){
//2. 만약 요소를 돌았는데 arr[i] 번째 요소가 배열이면
if(Array.isArray(arr[i])){
//요소가 배열이기 때문에 함수를 다시 돈다(요소를 돈다).다시 배열이 있는지를 체크해서 배열이 아닌 요소들을 처리
// [1] 에 접근 =>arr[0]은 배열이 아님.
//여기서의 newarr은 마지막의 newarr이 아니기 때문에 이것을 다시 꺼내와서 새롭게 넣어줘야 함.
const element=flattenArr(arr[i])
newarr.push(...element)
}else{
//돌았는데 arr[i]가 배열이 아니면..새로운 배열에 push 한다.
newarr.push(arr[i])
}
}
//만약에 배열이면 들어가서 무엇인가 액션을 취해야 함.
return newarr // newarr=[1]
}
조감도
|
반복해서 첫 번째 요소에 접근 |
배열인지 아닌지 판단 |
함수의 종료 |
|
|
|
|
arr |
[[1], 2, [3, 4], 5] |
|
|
배열임(요소가 배열이 아닐때까지 요소에 접근) |
|
[1] 를 arr로 치환하여 함수 재실행 arr[0]은 배열이 아님 newarr에 요소 push new arr 저장 return 으로 함수 종료 |
[1] 추출 새로운 elemente 저장 새로운 newarr에 요소 저장 |
If 배열 아니면 요소들을 다 돌아서 새로운 배열에 push() |
|
|
배열이 아니므로 2도 푸시 |
newarr |
|
|
[1,2] 완성 |