본문 바로가기

카테고리 없음

4499. Chunk

728x90

문제

Do you know lodashChunk is a very useful function in it, now let's implement it. Chunk<T, N> accepts two required type parameters, the T must be a tuple, and the N must be an integer >=1

type exp1 = Chunk<[1, 2, 3], 2> // expected to be [[1, 2], [3]]
type exp2 = Chunk<[1, 2, 3], 4> // expected to be [[1, 2, 3]]
type exp3 = Chunk<[1, 2, 3], 1> // expected to be [[1], [2], [3]]

cases

type cases = [
  Expect<Equal<Chunk<[], 1>, []>>,
  Expect<Equal<Chunk<[1, 2, 3], 1>, [[1], [2], [3]]>>,
  Expect<Equal<Chunk<[1, 2, 3], 2>, [[1, 2], [3]]>>,
  Expect<Equal<Chunk<[1, 2, 3, 4], 2>, [[1, 2], [3, 4]]>>,
  Expect<Equal<Chunk<[1, 2, 3, 4], 5>, [[1, 2, 3, 4]]>>,
  Expect<Equal<Chunk<[1, true, 2, false], 2>, [[1, true], [2, false]]>>,
]

문제 링크

풀이

조건

  1. T를 N 단위로 잘라 배열을 만든다.
  1. N 미만으로 남는 경우 하나의 배열로 만들어 마지막에 추가한다.

정답

type Chunk<T extends any[], N extends number, V extends any[] = []> =
    V['length'] extends N ? [V, ...Chunk<T, N>]
      : T extends [infer T1, ...infer RestT]
        ? Chunk<RestT, N, [...V, T1]>
        : V extends [] ? V : [V]

해설

우선, N만큼의 길이를 가지는 배열 1개를 분리한다.

type Chunk<T extends any[], N extends number, V extends any[] = []> =
    V['length'] extends N ? V
      : T extends [infer T1, ...infer RestT]
        ? Chunk<RestT, N, [...V, T1]>
        : any

 

N만큼의 길이를 가지는 배열을 가능한만큼 분리하도록 수정한다.

type Chunk<T extends any[], N extends number, V extends any[] = []> =
    V['length'] extends N ? [V, ...Chunk<T, N>]
      : T extends [infer T1, ...infer RestT]
        ? Chunk<RestT, N, [...V, T1]>
        : any

 

자르고 남은 나머지 요소들을 하나의 배열로 넣어 마지막에 넣어 준다.

type Chunk<T extends any[], N extends number, V extends any[] = []> =
    V['length'] extends N ? [V, ...Chunk<T, N>]
      : T extends [infer T1, ...infer RestT]
        ? Chunk<RestT, N, [...V, T1]>
        : [V]

 

마지막으로 V 가 빈 배열인 경우를 처리한다.

type Chunk<T extends any[], N extends number, V extends any[] = []> =
    V['length'] extends N ? [V, ...Chunk<T, N>]
      : T extends [infer T1, ...infer RestT]
        ? Chunk<RestT, N, [...V, T1]>
        : V extends [] ? V : [V]

 


혹시 글에 오류나 개선에 대한 피드백이 있다면 부담없이 댓글 부탁드립니다!

728x90