타입 챌린지 30958 - Pascal's triangle

소파의 벨로그·2025년 6월 7일

타입챌린지

목록 보기
107/131

문제 링크

문제

Given a number N, construct the Pascal's triangle with N rows.

N이 주어지면, N행의 파스칼의 삼각형을 만들어라

내 풀이

type GetLengthArr<N extends number,Results extends any[]=[]>=Results['length'] extends N?Results:GetLengthArr<N,[...Results,1]>
type Add<A extends number,B extends number>=[...GetLengthArr<A>,...GetLengthArr<B>]['length']
type MinusOne<A extends number>=GetLengthArr<A> extends [infer _,...infer R]?R['length']:number;


type PascalImplement<N extends number,BeforeColumn extends number[]=[],NowColumn extends any[]=[],Results extends number[][]=[]>=
  N extends Results['length']?Results:
  NowColumn['length'] extends BeforeColumn['length']?PascalImplement<N,[...NowColumn,1],[],[...Results,[...NowColumn,1]]>:
  NowColumn['length'] extends 0?PascalImplement<N,BeforeColumn,[1],Results>:
  PascalImplement<N,BeforeColumn,[...NowColumn,Add<BeforeColumn[MinusOne<NowColumn['length']],BeforeColumn[NowColumn['length']]>],Results>



type Pascal<N extends number> = PascalImplement<N>

우선 사용처에서 구현용 제네릭을 사용하지 못하게 하기 위해 구현과 실제 타입을 분리했다.

만약 Result의 길이가 N과 같으면 그대로 반환한다.
그렇지 않으면서 현재 행의 길이가 이전 행의 길이와 같다면 현재 행에 1을 붙여 Result와 BeforeColumn을 업데이트하고 그 다음 재귀로 넘어간다.
그렇지 않으면서 NowColumn의 길이가 0이면 NowColumn을 [1]로 업데이트한다
그렇지 않다면 이전 칼럼[i-1]+이전 칼럼[i]를 nowColumn에 넣어 업데이트한다.

0개의 댓글