본문 바로가기

FE/type-challenge

9898. FindEles

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

풀이

조건

  1. 중복되는 요소들을 삭제한다.
  1. 모든 요소가 중복된다면 빈 배열을 출력한다.

해설

우선 모든 요소를 탐색하는 로직을 설계한다.

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