fibonacci(5) // 5를 입력받으면 5를 반환해야 한다(num+1).
// 0 1 1 2 3 5 <-- 5번째 피보나치 수의 그 다음수(num+1)이 5여서.
수(num)를 입력받아 num번째까지 총 num + 1개의 피보나치 수열을 리턴하는 문제. 빈 배열을 만들고, 반복문을 이용해 0과 1을 받을 땐 그대로 배열에 넣고, 2를 순회할 땐 result 배열의 전전 인덱스와 전 인덱스를 더해준 값을 배열에 추가하면 된다. 피보나치 수열은 전전 수와 전 수를 합한 것이 계속 반복되기 때문이다. 이를 아래처럼 반복문으로 짜볼 수 있다.
[] // 변수에 빈 배열 선언
[0] // i가 0일 땐 0을 그대로 배열에 넣어준다. 전값, 전전값을 아직 모르기 때문이다.
[0, 1] // i가 1일때도 1을 그대로 넣어준다. 위와 동일
[0, 1, 1] // i가 2일 때부터 result 배열에 전전 인덱스(-2)와 전 인덱스(-1)를 더한 값을 넣어준다.
[0, 1, 1, 2] // 위와 동일...반복
i
조건을 i <= num
으로 해야된다. num수를 입력받아 그 수 만큼의 피보나치 수열이 반복되야 하니 배열 순회 역시 num만큼 해야하기 때문이다.const arr = [[1, 2], [undefined, 4, '5'], [9, 'hello']]
위 같은 2차원 배열을 입력받아 숫자인 요소의 총합을 리턴해야 한다. 다행히 힌트가 친절하게 적혀있어서 풀 수 있었다.
reduce()
filter()
reduce
2차원 배열을 1차원으로 바꾸는 여러가지 방법이 있겠지만 일단 아래 3가지 정도로 정리했다(MDN 링크 참고). 배열의 depth가 깊어질 수록 배열을 펼치는 방법은 더 복잡해지는 것 같다.
flat()
메서드 활용
arr.flat() // 기본값 1depth
// [1, 2, undefined, 4, "5", 9, "hello"]
reduce()
메서드 활용
arr.reduce((acc, cur) => acc.concat(cur), [])
// [1, 2, undefined, 4, "5", 9, "hello"]
// 초기값 []을 적지 않아도 작동은 된다. 하지만 적는걸 습관화하는게 좋을 것 같다.
concat
과 Spread Syntax
활용
[].concat(...arr)
// [1, 2, undefined, 4, "5", 9, "hello"]
reduce는 단순히 2차원 배열(arr) 안에 있는 배열 요소를 순회하는데 어떻게 위 콘솔 이미지처럼 2차원 배열을 벗겨내고 1차원 배열로 반환한거지? 궁금해졌다. 결론은, concat
때문에 그런 것 같다.