게임의 목적은 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것이다. (위키백과-하노의의탑)
- 한 번에 한개의 원판만 옮길 수 있다.
- 가장 위에 있는 원판만 이동할 수 있다.
- 큰 원판이 작은 원판 위에 있어서는 안 된다.
그림을 통해 살펴보자.

해당 그림에서는 기둥이 없지만 3개의 기둥이 있다고 생각해보자.
각각의 3개의 기둥을 A, B, C 이고 원판들을 A에서 C로 2개의 원판을 옮기는 방법을 보자.
총 3번 이동한다.
위를 바탕으로 3개의 원판을 이동하는 방법도 알아보자.
편의상 원판을 1, 2, 3 으로 수를 부여해 숫자가 작을 수록 위의 원판이라고 생각한다.
A->C
A->B
C->B
B->A
B->C
A->C
3개의 원판을 옮기는 과정을 전부 알아보았다. 총 7번 이동하였다.
위의 2개, 3개의 원판을 이동한 과정을 통해 결론을 도출 해보자.
A->B(마지막 원판을 제외한 원판들을 목적지가 아닌 곳에 이동)
A->C(마지막 원판을 목적지에 이동)
A->C(나머지 원판들을 목적지에 이동)
1번 3번의 경우 나머지 원판들을 특정 위치에 이동시키는 것은 한 위치에서 특정 위치로 이동하는 것으로 생각할 수 있다.
이러한 특성 때문에 재귀함수로 구현이 가능하다.
def hanoi_tower(n, from, others, to, result):
if n <= 0: return
hanoi_tower(n-1, from, to, others, result) # A->B 이동
print(A, C) # A->C 이동
hanoi_tower(n-1, others, from, to, result) # B->C 이동
def solution(n):
answer = []
hanoi_tower(n, 1, 2, 3, answer)
return answer
hanoi_tower 함수에서 우리가 정의한 대로 재귀함수로 호출 하였다.
원판의 이동 횟수는 개수에 따라 일정한 특징을 가진다.
1개 -> 1회
2개 -> 2²-1회
3개 -> 2³-1회
...
..
n개 -> 2ⁿ-1회
원판의 이동횟수는 원판의 개수가 n이라고 할때 2ⁿ-1 를 가진다.
하노의 탑은 재귀함수를 적용하는 대표적인 예이지만 처음에 풀이 하려고 할 때는 쉽게 이해가 가지 않았다.
잘 이해가 가지 않은 분들은 학습에 참고한 영상 링크를 참고하면 좋을 것 같다.
👇 클릭
하노이 탑(Tower of Hanoi) 재귀호출 코드 구현 [혀니C코딩]
재귀함수가 뭔가요? (Feat. 하노이의 탑) [얄팍한 코딩사전]
다음을 참고했습니다.
위키백과-하노의의탑
Tower_of_Hanoi_4.gif
하노이 탑(Tower of Hanoi) 재귀호출 코드 구현 [혀니C코딩]
재귀함수가 뭔가요? (Feat. 하노이의 탑) [얄팍한 코딩사전]