타입 챌린지 4499 - Chunk

소파의 벨로그·2025년 4월 27일

타입챌린지

목록 보기
67/131

문제 링크

문제

lodash를 아시나요? Chunk는 lodash에 있는 매우 유용한 함수입니다.
이제부터 Chunk를 구현합시다.

Chunk<T, N>는 두 가지 필수 파라미터를 받습니다. T는 tuple이여야하고, N은 1 이상의 정수여야 합니다.

Do you know lodash? Chunk 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 ChunkImplement<T extends any[],N extends number,Result extends any[]=[],Tmp extends any[]=[]>=
  T extends [infer First,...infer Rest]?
      [...Tmp,First]['length'] extends N?
        ChunkImplement<Rest,N,[...Result,[...Tmp,First]]>
        :ChunkImplement<Rest,N,Result,[...Tmp,First]>
    :Tmp['length'] extends 0?Result:[...Result,Tmp]

type Chunk<T extends any[], N extends number> = ChunkImplement<T,N>

우선 사용처에서 Result와 Tmp에 접근 못하게 분리해서 구현했다.

T를 재귀적으로 순회하며 Tmp를 채워나간다
만약 Tmp의 length가 N과 같다면 Result에 넣는다.

만약 T를 모두 순회했다면 Result를 반환한다.
단, Result에 들어가지 못한 Tmp가 있을 수 있으니 Tmp 빈 배열 여부를 구분해
Tmp가 비어있는 경우에는 그냥 Result를, 비어있지 않은 경우에는 Result뒤에다가 Tmp를 덧붙여 반환했다.

다른 사람의 풀이

type Chunk<T extends any[], N extends number, Swap extends any[] = []> =
Swap['length'] extends N
  ? [Swap, ...Chunk<T, N>]
  : T extends [infer K, ...infer L]
    ? Chunk<L, N, [...Swap, K]>
    : Swap extends [] ? Swap : [Swap]

이런식으로 Result 없이 조건문을 하나 추가해 제네릭을 하나 줄인 풀이도 존재했다.

참고자료

https://github.com/type-challenges/type-challenges/issues/4513

0개의 댓글