06
10

- 예시

_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]
 
_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]

_.chunk(['a', 'b', 'c', 'd', 'e', 'f'], 2);
// => [['a', 'b'], ['c', 'd'], ['e', 'f']]

_.chunk(['a', 'b', 'c', 'd', 'e', 'f', 'g'], 3);
// =>  [['a', 'b', 'c'], ['d', 'e', 'f'], ['g']]

- 구현

const chunk = (arr, size) => {
  const result = [];
  
  // arr 원본을 수정하지 않기 위해, slice로 복사한다.
  const copyArr = arr.slice();

  // 배열을 돌면서,
  copyArr.map(() => {
    // splice로 size만큼 원본 배열을 빼면서,
    const temp = copyArr.splice(0, size)
    // 임시로 만든 result배열로 넣어서 이중배열 구조를 만든다.
    result.push(temp)
  })
  
  // splice로 배열을 빼버리면서 map으로 탐색 하고 있으므로, 
  // copyArr를 전부 돌고 나서, 남은 요소들을을 result와 합쳐서 return한다.
  return result.concat([copyArr]);
}

- 소감

  • 오랜만이니까 제일 앞에 거 해야지 하다가 혈압 올라서 요단강 래프팅 투어 갈 뻔했다. 무시하지 말자...
  • 생각보다 어렵다... 마지막 남은 것 처리는 어떻게 하지? 혹은, reduce로 한 번에 처리할 순 없을까?, 제귀로 처리할까? 와 같은 별거 아닌 고민들로 시간을 많이 날렸다.
  • 습관적으로 알고리즘을 보면 제귀함수부터 쓰려고 한다. 효율적인 방법도 아니고, 코드 가독성도 그리 좋지 못하니 배열을 순회하는 함수를 조금 더 사용하면 좋을 것 같다.
  • slice로 배열을 카피해서 사용하는 것이 아무래도 조금 불편하다. reduce로 한 번에 처리하고 싶다...!
COMMENT