✍ 공부/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 재귀를 돌아주는 것!
간단한 아이디어지만 엄청나다..!
반응형