✍ 공부/TypeScript

[type-challenges] ReplaceAll

Po_tta_tt0 2023. 6. 13. 21:16
반응형

문제

주어진 문자열 S에서 부분 문자열 From을 찾아 모두 To로 교체하는 제네릭 ReplaceAll<S, From, To>을 구현하세요.

설명

/* _____________ Your Code Here _____________ */

type ReplaceAll<S extends string, From extends string, To extends string> = 
  From extends ""
  ? S
  :
  S extends `${infer A}${From}${infer E}` 
  ? `${A}${To}${ReplaceAll<E,From,To>}`
  : S

type tt = ReplaceAll<'foobarfoobar', 'ob', 'b'>
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<ReplaceAll<'foobar', 'bar', 'foo'>, 'foofoo'>>,
  Expect<Equal<ReplaceAll<'foobar', 'bag', 'foo'>, 'foobar'>>,
  Expect<Equal<ReplaceAll<'foobarbar', 'bar', 'foo'>, 'foofoofoo'>>,
  Expect<Equal<ReplaceAll<'t y p e s', ' ', ''>, 'types'>>,
  Expect<Equal<ReplaceAll<'foobarbar', '', 'foo'>, 'foobarbar'>>,
  Expect<Equal<ReplaceAll<'barfoo', 'bar', 'foo'>, 'foofoo'>>,
  Expect<Equal<ReplaceAll<'foobarfoobar', 'ob', 'b'>, 'fobarfobar'>>,
  Expect<Equal<ReplaceAll<'foboorfoboar', 'bo', 'b'>, 'foborfobar'>>,
  Expect<Equal<ReplaceAll<'', '', ''>, ''>>,
]

${S}${To}${ReplaceAll<E,From,To>} 이부분이 이 문제의 핵심이라고 생각한다.


다른 부분은 전 문제들과 거의 같다.
전체를 다 돌기 위해서 처음에는 그냥 ReplaceAll로 재귀를 돌아줬는데 -2,-1번째 케이스를 통과하지 못했다.

그럴만도하다. ob를 빼고 다시 재귀를 돌면 ob가 다시 나와서 또 제거하게 된다.


그래서
A, To, E(저번 문제에 했었죠?)로 나누고,
E(한번 From을 To로 바꾼 나머지 부분)에서 또 ReplaceAll 재귀를 돌아주는 것!
간단한 아이디어지만 엄청나다..!

반응형