반복문 25번 — fibonacci


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] // 위와 동일...반복

고차함수 32번 — sumOfArraysInArray


const arr = [[1, 2], [undefined, 4, '5'], [9, 'hello']]

위 같은 2차원 배열을 입력받아 숫자인 요소의 총합을 리턴해야 한다. 다행히 힌트가 친절하게 적혀있어서 풀 수 있었다.

  1. 2차원 배열을 1차원 배열로 만들어주고 → reduce()
  2. 배열안에 숫자인 것만 따로 걸르고 → filter()
  3. 배열 안 숫자의 합을 구한다 → reduce

2차원 배열을 1차원으로 바꾸는 여러가지 방법이 있겠지만 일단 아래 3가지 정도로 정리했다(MDN 링크 참고). 배열의 depth가 깊어질 수록 배열을 펼치는 방법은 더 복잡해지는 것 같다.

  1. flat() 메서드 활용

    arr.flat() // 기본값 1depth
    // [1, 2, undefined, 4, "5", 9, "hello"]
    
  2. reduce() 메서드 활용

    arr.reduce((acc, cur) => acc.concat(cur), [])
    // [1, 2, undefined, 4, "5", 9, "hello"]
    // 초기값 []을 적지 않아도 작동은 된다. 하지만 적는걸 습관화하는게 좋을 것 같다. 
    
  3. concatSpread Syntax 활용

    [].concat(...arr)
    // [1, 2, undefined, 4, "5", 9, "hello"]
    

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0570a106-f92b-4392-a5ec-9b209316bbae/Untitled.png

reduce는 단순히 2차원 배열(arr) 안에 있는 배열 요소를 순회하는데 어떻게 위 콘솔 이미지처럼 2차원 배열을 벗겨내고 1차원 배열로 반환한거지? 궁금해졌다. 결론은, concat 때문에 그런 것 같다.