타입 챌린지 3243 - FlattenDepth

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

타입챌린지

목록 보기
58/131

문제 링크

문제

배열을 depth회까지 평탄화하라

Recursively flatten array up to depth times.

내 풀이

type FlattenDepthImplement<T extends any[],MaxDepth extends number,DepthArr extends any[]=[]> = 
  MaxDepth extends DepthArr['length']?T
    :T extends [infer First, ...infer Rest]?
      [...(First extends any[]?
        FlattenDepthImplement<First,MaxDepth,[...DepthArr,1]>
        :[First])
      ,...FlattenDepthImplement<Rest,MaxDepth,DepthArr>]
    :[]

type FlattenDepth<T extends any[],MaxDepth extends number=1>=FlattenDepthImplement<T,MaxDepth>

사용처에서 DepthArr 제네릭 사용을 제한하기 위해 FlattenDepthImplement을 구현했다.

배열을 분해하기 위해 First의 타입을 조사 후, 배열이라면 재귀적으로 넣어주고, 배열이 아니라면 해당 값을 배열로 감싸주어 spread연산자를 사용했다.

다른 사람의 풀이

type FlattenOnce<T extends any[], U extends any[] = []> = T extends [infer X, ...infer Y] ? (
  X extends any[] ? FlattenOnce<Y, [...U, ...X]> : FlattenOnce<Y, [...U, X]>
) : U

type FlattenDepth<
  T extends any[],
  U extends number = 1,
  P extends any[] = []
> = P['length'] extends U ? T : (
  FlattenOnce<T> extends T ? T : (
    FlattenDepth<FlattenOnce<T>, U, [...P, any]>
  )
)

linjunc의 풀이이다

FlattenOnce라는 것을 이용해 T를 1회 flatten을 해준 후,

그 값이 T와 같다면 T가 이미 flatten 된 값이기 때문에 바로 반환하고,
그렇지 않다면 FlattenOnce한 값을 다시 FlattenDepth에 넣어준다.

참고자료

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

0개의 댓글