728x90
문제
Find the elements in the target array that appear only once. For example:input: [1,2,2,3,3,4,5,6,6,6]
,ouput: [1,4,5]
.
cases
type cases = [
Expect<Equal<FindEles<[1, 2, 2, 3, 3, 4, 5, 6, 6, 6]>, [1, 4, 5]>>,
Expect<Equal<FindEles<[2, 2, 3, 3, 6, 6, 6]>, []>>,
Expect<Equal<FindEles<[1, 2, 3]>, [1, 2, 3]>>,
]
정답
type RemoveDuplicate<T extends any[], U> = T extends [infer T1, ...infer Rest]
? T1 extends U ? Rest : [T1, ...RemoveDuplicate<Rest, U>]
: T
type FindEles<T extends any[], Result extends any[] = [], Duplicated = never> =
T extends [infer T1, ...infer Rest]
? T1 extends Duplicated
? FindEles<Rest, RemoveDuplicate<Result, T1>, Duplicated>
: FindEles<Rest, [...Result, T1], Duplicated | T1>
: Result
풀이
조건
- 중복되는 요소들을 삭제한다.
- 모든 요소가 중복된다면 빈 배열을 출력한다.
해설
우선 모든 요소를 탐색하는 로직을 설계한다.
type FindEles<T extends any[], Result extends any[] = []> =
T extends [infer T1, ...infer Rest]
? // todo
: Result
T1을 확인하는 로직에 Duplicated
를 추가하여 이전에 입력된 요소인지 확인한다.
type FindEles<T extends any[], Result extends any[] = [], Duplicated = never> =
T extends [infer T1, ...infer Rest]
? T1 extends Duplicated
? FindEles<Rest, Result, Duplicated>
: FindEles<Rest, [...Result, T1], Duplicated | T1>
: Result
위 로직에서는 모든 요소가 Result에 추가되므로, 중복된 경우 삭제해주는 로직이 필요하다.
RemoveDuplicate 타입을 추가해서 중복된 요소를 제거하는 로직을 구현한다.
type RemoveDuplicate<T extends any[], U> = T extends [infer T1, ...infer Rest]
? T1 extends U ? Rest : [T1, ...RemoveDuplicate<Rest, U>]
: T
RemoveDuplicate 구현시 원래는 모든 요소를 검색해야 하지만, 애초에 입력에 들어올 때 검사해서 입력에 넣으므로 같은 요소가 두 번이상 입력되지는 않는다고 가정한다.
이 두 가지 타입을 연결하면 다음과 같다.
type RemoveDuplicate<T extends any[], U> = T extends [infer T1, ...infer Rest]
? T1 extends U ? Rest : [T1, ...RemoveDuplicate<Rest, U>]
: T
type FindEles<T extends any[], Result extends any[] = [], Duplicated = never> =
T extends [infer T1, ...infer Rest]
? T1 extends Duplicated
? FindEles<Rest, RemoveDuplicate<Result, T1>, Duplicated>
: FindEles<Rest, [...Result, T1], Duplicated | T1>
: Result
혹시 오류나 개선점이 있다면, 댓글 부탁드립니다.
728x90
'FE > type-challenge' 카테고리의 다른 글
18142. All (0) | 2023.09.25 |
---|---|
16259. ToPrimitive (0) | 2023.09.22 |
10969. Integer (0) | 2023.09.15 |
9896. GetMiddleElement (0) | 2023.09.12 |
9616. ParseUrlParams (0) | 2023.09.11 |