타입 챌린지 30430 - Tower of hanoi

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

타입챌린지

목록 보기
106/131

문제 링크

문제

하노이의 탑을 시뮬레이션하라.
타입은 고리의 숫자를 입력 값으로 받아 추가적인 C를 이용해서 A로부터 B로 가는 고리의 과정이 단긴 배열을 반환한다.
각 나열은 From에서 To로 움직이는 값을 나타내는 [From,To] 문자열 쌍이여야 한다.

Simulate the solution for the Tower of Hanoi puzzle. Your type should take the number of rings as input an return an array of steps to move the rings from tower A to tower B using tower C as additional. Each entry in the array should be a pair of strings [From, To] which denotes ring being moved From -> To.

내 풀이

type HanoiImpelement<N extends number,From = 'A', To = 'B', Intermediate = 'C',Index extends any[]=[1] >=
  N extends Index['length']?[[From,To]]:
  [...HanoiImpelement<N,From,Intermediate,To,[...Index,1]>,[From,To],...HanoiImpelement<N,Intermediate,To,From,[...Index,1]>]

type Hanoi<N extends number, From = 'A', To = 'B', Intermediate = 'C'> = N extends 0?[]:HanoiImpelement<N,From,To,Intermediate>

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

개념은 간단하다.
Index는 현재 밑에서 몇 번째의 고리인지를 나타낸다.
From에 있는 N번째 고리를 빼기 위해서는 모든 값을 Intermediate로 보낸다.
이후 From을 To로 옮기고, Intermediate에 있는 값을 다시 To로 보낸다.

이걸 재귀적으로 반복하면 문제가 해결된다.

0개의 댓글