타입 챌린지 4425 - Greater Than

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

타입챌린지

목록 보기
64/131

문제 링크

문제

이 문제에서 T > U와 같은 GreaterThan<T, U>를 구현해야 합니다.

음수는 고려하지 않습니다

In This Challenge, You should implement a type GreaterThan<T, U> like T > U

Negative numbers do not need to be considered.

내 풀이

type StringToNumber<S extends string>=
  S extends `${infer R extends number}`?
    R
    :0

type NumberTuple<S extends string,Result extends number[]=[]>=
  `${S}` extends `${infer Start}${infer Last}`?
    NumberTuple<Last,[...Result,StringToNumber<Start>]>
    :[...Result,StringToNumber<S>]

type LinearGreaterThan<A extends number,B extends number,Tmp extends any[]=[]>=
  A extends Tmp['length']?false:
  B extends Tmp['length']?true:
  LinearGreaterThan<A,B,[...Tmp,1]>

type GreaterThanSameLength<T extends number[], U extends number[],LengthArr extends any[]=[],TN extends number=T[LengthArr['length']],UN extends number=U[LengthArr['length']]>=
  T['length'] extends LengthArr['length']?
    false
    :TN extends UN?
      GreaterThanSameLength<T,U,[...LengthArr,1]>
      :LinearGreaterThan<TN,UN>
  

type GreaterThanImplement<T extends number[],U extends number[]>=
  T['length'] extends U['length']?
    GreaterThanSameLength<T,U>
    :LinearGreaterThan<T['length'],U['length']>
    

type GreaterThan<T extends number, U extends number> =
  GreaterThanImplement<NumberTuple<`${T}`>,NumberTuple<`${U}`>>

추가 예제가 들어오면서 linear하게 구현하지 못하게 되어 난이도가 상승한 문제이다.

풀이 과정은 다음과 같다.

먼저 숫자를 1자리 숫자 배열로 바꾼다(NumberTuple)
이때 ${S} extends ${infer Start extends number}${infer Last extends number}를 사용하면 0111과 같이 0이 맨 앞에 오는 경우 start와 last가 각각 1,11로 대응되기 때문에
문자열 별로 분리한 후, 그 문자열을 숫자로 바꾸는(StringToNumber) 과정을 사용했다.

T와 U를 숫자 배열로 바꾼 뒤 두 배열의 길이를 비교한다.
1)두 배열의 길이가 다르다면, 두 배열의 길이를 선형적으로 비교한다(LinearGreaterThan)
2)두 배열의 길이가 같다면, 앞에서부터 선형적으로 크기를 비교한다.

다른 사람의 풀이

'0123456789' extends `${string}${TF}${string}${UF}${string}

다음과 같은 방식을 통해 숫자의 크기 비교를 한 풀이가 있었다.

신박한 풀이인 것 같다.

참고자료

https://github.com/type-challenges/type-challenges/issues/21721#issuecomment-1480788068

0개의 댓글