02257
MinusOne
type MinusOne<T extends number> = T extends 0 ? -1 : ParsInt<RemoveLeadingZero<ReverseString<StringIntegerMinusOne<ReverseString<`${T}`>>>>>
type StringIntegerMinusOne<T extends string> = T extends `${infer First extends number}${infer Rest}` ?
First extends 0 ? `9${StringIntegerMinusOne<Rest>}` : `${[9,0,1,2,3,4,5,6,7,8][First]}${Rest}`
: never;
type ReverseString<S extends string> = S extends `${infer First}${infer Rest}` ? `${ReverseString<Rest>}${First}` : S;
type RemoveLeadingZero<S extends string> = S extends "0" ? S : S extends `0${infer Rest}` ? RemoveLeadingZero<Rest> : S;
type ParsInt<S extends string> = S extends `${infer Digit extends number}` ? Digit : never;
해답을 봤다.
배열의 인덱스와 순서는 1 차이가 나는 점을 이용하여
계산을 하는 방식이며,
연산을 위해 문자열로 변환, 순서뒤집기 등의 과정이 포함되었다.