kakasoo

[Type-Challenge] 04518-medium-fill, 더 좋은 풀이법 본문

프로그래밍/TypeScript

[Type-Challenge] 04518-medium-fill, 더 좋은 풀이법

카카수(kakasoo) 2024. 3. 24. 22:55
반응형
type Fill<
  T extends unknown[],
  N,
  Start extends number = 0,
  End extends number = T['length'],
  L extends any[] = [], // 최종적으로 출력되어야 하는 결과 값을 의미한다.
> = T extends [infer H, ...infer R]
  ? [...L, 0][Start] extends undefined
    ? Fill<R, N, Start, End, [...L, H]>
    : [...L, 0][End] extends undefined
      ? Fill<R, N, Start, End, [...L, N]>
      : Fill<R, N, Start, End, [...L, H]>
  : L

위처럼 프로퍼티가 하나 추가된 상황만을 생각해보자.

 

type Fill<
  T extends unknown[],
  N,
  Start extends number = 0,
  End extends number = T['length'],
  L extends any[] = [], // 최종적으로 출력되어야 하는 결과 값을 의미한다.
> = T extends [infer H, ...infer R]
  ? [...L, 0][Start] extends undefined
    ? Fill<R, N, Start, End, [...L, H]> // 조건에 따라 여기서 새로운 값 H가 담기고 재귀를 돌 것이다.
    : [...L, 0][End] extends undefined
      ? Fill<R, N, Start, End, [...L, N]> // 조건에 따라 여기서 새로운 값 N이 담기고 재귀를 돌 것이다.
      : Fill<R, N, Start, End, [...L, H]> // 조건에 따라 여기서 새로운 값 H가 담기고 재귀를 돌 것이다.
  : L

 

조건이 성립할 때, N과 H는 튜플의 마지막에 들어간다.
그 이유는 여기에 담은 값이 튜플 L의 마지막 요소지만, 재귀를 타고 들어간 다음에는 지금까지 담은 요소들 중 마지막을 의미하기 때문이다.
이해를 돕기 위해 한 두번만 재귀를 직접 타보도록 하자.
조건은 T는 [1,2,3] 이라는 튜플이며 Start가 1이고, End가 3인 상황이라고 해보자.
최초의 식은 인덱스가 0이기 때문에 아래의 흐름이 된다.

  1. T는 infer H와 나머지 요소들 R로 이루어진 튜플이 맞다.
  2. 아직까지 담은 것은 없기 때문에 L은 빈 배열이고 첫번째 조건식을 타게 된다.
  3. 0이 의미하는 바는, 현재 인덱스를 표시하기 위한 것이다. L은 빈 배열이었기 때문에 0만 있는 배열이 되었을 것이고, 검사하는 위치는 0의 위치다.
  4. 즉, 0만 담긴 배열에 Start를 인덱스로 주어서 undefined인지 체크하는 것이 다음 조건이 된다.
  5. undefined가 나온다는 것은 애초에 값이 없었다는 것, 즉 배열의 범위 밖이라는 것이 되기 때문에 이번 재귀에서는 H를 마지막에 넣고 재귀를 탄다.

다음으로는 이제 인덱스 1을 검사해야 할 때라고 해보자.
이제 L은 [H]로 추론되는 튜플일 것이다.
마찬가지로 검사를 위해 배열인지 체크하는 구간을 지나서 [...L, 0]를 타게 된다.

 

  1. [...L, 0]은 이전 검사를 통해 [H, 0]임을 알 수 있다. 마찬가지로 0의 위치는 현재 검사하려는 인덱스이다.
  2. 이번에는 Start가 인덱스로 대입될 때 그 값은 0이 나올 것이고 undefined를 타지 않는다.
  3. 그렇다면 End를 인덱스로 주어, undefined인지 검사한다.
  4. 검사하려는 인덱스는 즉, 0이 있는 위치이고, 0이 있는 위치는 재귀식에서 항상 L의 마지막 요소이다.
  5. 따라서 이 튜플에 End를 넣어 undefined가 나온다는 것은, 아직 End보다 작다는 것과 마찬가지가 된다.

이로써 Start를 대입하는 것은, 인덱스가 Start 위치에 도달할 만큼 0의 위치가 이동했는지를 의미하는 것이 될 것이며,

End에 도달하지 못했음은 아직 그만큼 인덱스가 이동하지 않았다는 의미가 됨으로 해석할 수 있는 것이다.

 

 

4518 - Fill · Issue #5622 · type-challenges/type-challenges

type Fill< T extends unknown[], N, Start extends number = 0, End extends number = T['length'], L extends any[] = [], > = T extends [infer H, ...infer R] ? [...L, 0][Start] extends undefined ? Fill<...

github.com

 

반응형