타입 챌린지 112 - Capitalize Words

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

타입챌린지

목록 보기
122/131

문제 링크

문제

각 문자열 단어의 첫 문자를 대문자로 하고 나머지를 그대로 놔두는 CapitalizeWords<T>를 구현하라.

Implement CapitalizeWords<T> which converts the first letter of each word of a string to uppercase and leaves the rest as-is.

내 풀이

type IsAlphabet<T extends string>= Uppercase<T>&Lowercase<T> extends never?true:false;

type CapitalizeWordsImplement<S extends string, IsParsed = false,Result extends string=''>=
  string extends S?string:
  S extends `${infer H}${infer Rest}`?
    IsAlphabet<H> extends true?
      IsParsed extends true?CapitalizeWordsImplement<Rest,true,`${Result}${H}`>:
      CapitalizeWordsImplement<Rest,true,`${Result}${Uppercase<H>}`>:
    CapitalizeWordsImplement<Rest,false,`${Result}${H}`>
  :Result

type CapitalizeWords<S extends string> = CapitalizeWordsImplement<S>

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

해당 문자가 알파벳인지 확인하는 isAlphabet(해당 풀이)를 먼저 만들었다.
이때, isAlphabet에는 string이 들어가지 않는 것이 보장되므로 해당 분기처리는 하지 않았다.

그리고 구현체에서는 제네릭 Result에 결과값을 넣도록 해 재귀적으로 타입을 구현하였다.
그리고, 이전 알파벳이 대문자로 바뀐 경우를 확인하기 위해 IsParsed라는 플래그를 구현하였다.

재귀는 다음과 같이 돌아간다.

만약, 첫번째 문자가 알파벳인 경우 IsParsed를 확인한다.
첫번째 문자가 알파벳이면서 IsParsed가 true인 경우 해당 알파벳은 별도의 처리를 하지 않고 다음 값으로 넘어간다.
이때, 다음 재귀의 IsParsed는 확인했던 IsParsed를 그대로 넣어준다.

첫번째 문자가 알파벳이면서 IsParsed가 false인 경우 해당 알파벳을 대문자로 바꾼 후, 다음 재귀에 IsParsed 값을 true로 두어 다음 재귀를 진행한다.

첫번째 문자가 알파벳이 아닌 경우, 별도의 처리를 하지 않고 다음 값으로 넘어간다. 이때, IsParsed를 false로 적용해 넘어간다.

다른 사람의 풀이

type CapitalizeWords<
  S extends string,
  W extends string = ''
> = S extends `${infer A}${infer B}`
  ? Uppercase<A> extends Lowercase<A>
    ? `${Capitalize<`${W}${A}`>}${CapitalizeWords<B>}`
    : CapitalizeWords<B, `${W}${A}`>
  : Capitalize<W>

해당 풀이

Capitalize를 사용한 풀이이다.

W는 지금까지 저장된 알파벳 문자열이다.

만약 첫 문자가 알파벳이라면 뒤에있는 글자를 재귀적으로 반복하고, ${W}${A}를 W에 넣는다.

만약 첫 문자가 알파벳이 아니라면 기존 알파벳 뒤에 첫 문자를 넣은 값을 Capitalize하고 그 뒤의 값을 재귀적으로 반복한다.

참고자료

https://github.com/type-challenges/type-challenges/issues/19571

0개의 댓글