Algorithm/모두의 알고리즘 with Python

[재귀 호출] 하노이의 탑

비번변경 2021. 9. 29. 19:41

하노이의 탑(Tower of Hanoi)

원반 옮기기 퍼즐

하노이의 탑(Tower of Hanoi)
이미지 출처 : https://www.stemlittleexplorers.com/hr/kako-napraviti-rijesiti-hanoi-toranj/

크기가 다른 원반 n개와 원반을 끼울 수 있는 기둥 3개가 존재한다.

어떻게 하면 원반 n개를 Start 기둥에서 Goal 기둥으로 옮길 수 있는가? 제약 사항은 아래와 같다.

  • 원반은 한 번에 한 개 씩만 옮길 수 있다.
  • 각 기둥 맨 위의 원반은 다른 기둥의 맨 위로만 움직일 수 있다.
  • 옮기는 과정에서 큰 원반을 작은 원반 위에 올릴 수는 없다.

 

풀이 방법

- 원반이 한개인 경우

원반이 한개인 경우

 

- 원반이 n개인 경우

원반이 n개인 경우_1
원반이 n개인 경우_2
원반이 n개인 경우_3

즉, 원반이 1개일 때가 종료 조건인 재귀 함수로 하노이의 탑 알고리즘을 구현할 수 있다.

 

코드 구현

def hanoi(n, from_p, to_p, aux_p): # 매개변수 n은 원반 수, from_p는 출발 기둥, to_p는 도착 기둥, aux_p는 보조 기둥
    if n == 1:
        print(f"{from_p} -> {to_p}")
        return
    hanoi(n - 1, from_p, aux_p, to_p) # 보조 기둥으로 이동
    print(f"{from_p} -> {to_p}")
    hanoi(n - 1, aux_p, to_p, from_p) # 도착 기둥으로 이동

n개의 원반을 옮기는 횟수는 \( 2^n-1 \) 이므로 알고리즘의 계산 복잡도는 \( O(n^2) \) 이다.

 

참고문서

https://thebook.io/006935/

728x90