프로그래밍/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이기 때문에 아래의 흐름이 된다.
- T는 infer H와 나머지 요소들 R로 이루어진 튜플이 맞다.
- 아직까지 담은 것은 없기 때문에 L은 빈 배열이고 첫번째 조건식을 타게 된다.
- 0이 의미하는 바는, 현재 인덱스를 표시하기 위한 것이다. L은 빈 배열이었기 때문에 0만 있는 배열이 되었을 것이고, 검사하는 위치는 0의 위치다.
- 즉, 0만 담긴 배열에 Start를 인덱스로 주어서 undefined인지 체크하는 것이 다음 조건이 된다.
- undefined가 나온다는 것은 애초에 값이 없었다는 것, 즉 배열의 범위 밖이라는 것이 되기 때문에 이번 재귀에서는 H를 마지막에 넣고 재귀를 탄다.
다음으로는 이제 인덱스 1을 검사해야 할 때라고 해보자.
이제 L은 [H]로 추론되는 튜플일 것이다.
마찬가지로 검사를 위해 배열인지 체크하는 구간을 지나서 [...L, 0]를 타게 된다.
- [...L, 0]은 이전 검사를 통해 [H, 0]임을 알 수 있다. 마찬가지로 0의 위치는 현재 검사하려는 인덱스이다.
- 이번에는 Start가 인덱스로 대입될 때 그 값은 0이 나올 것이고 undefined를 타지 않는다.
- 그렇다면 End를 인덱스로 주어, undefined인지 검사한다.
- 검사하려는 인덱스는 즉, 0이 있는 위치이고, 0이 있는 위치는 재귀식에서 항상 L의 마지막 요소이다.
- 따라서 이 튜플에 End를 넣어 undefined가 나온다는 것은, 아직 End보다 작다는 것과 마찬가지가 된다.
이로써 Start를 대입하는 것은, 인덱스가 Start 위치에 도달할 만큼 0의 위치가 이동했는지를 의미하는 것이 될 것이며,
End에 도달하지 못했음은 아직 그만큼 인덱스가 이동하지 않았다는 의미가 됨으로 해석할 수 있는 것이다.
반응형