하노이의 탑
DSA-알고리즘

하노이의 탑

구현

1
2
3
4
5
6
7
8
def move_tower(height, from_pole, to_pole, with_pole):
    if height >= 1:
        move_tower(height - 1, from_pole, with_pole, to_pole)
        move_disk(from_pole, to_pole)
        move_tower(height - 1, with_pole, to_pole, from_pole)

def move_disk(from_p, to_p):
    print(f"{from_p}에서 {to_p}로 탑 원판 옮기기")
  • move_tower

    • 종료 조건

      높이가 1 이상이 아니라면 종료한다.

    • 재귀 호출 1

      from -> with, 기둥 to를 경유한다.

    • 재귀 호출 2

      with -> to, 기둥 from을 경유한다.

  • move_disk

    원판의 이동을 출력한다.

세 개의 기둥은 나중에 들어간 원판이 먼저 나오는 LIFO 방식으로 작동한다.

따라서 각각의 기둥에 Stack을 적용해 원판의 이동을 Push와 Pop으로 구현할 수도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
foo = ['A', 'B', 'C']
bar = [Stack() for x in range(3)]
temple = dict(zip(foo, bar))
for i in range(4):
    temple['A'].push(4-i)
print(temple)

def move_tower(height, from_pole, to_pole, with_pole):
    if height >= 1:
        move_tower(height - 1, from_pole, with_pole, to_pole)
        move_disk(from_pole, to_pole)
        move_tower(height - 1, with_pole, to_pole, from_pole)

def move_disk(from_p, to_p):
    foo = temple[from_p].pop()
    temple[to_p].push(foo)
    print(temple)

move_tower(4, "A", "B", "C")

pop 메서드가 호출될 때 repr로 출력되기 때문에 print를 사용한 별도의 출력은 필요하지 않다.

시각화

turtle 모듈로 시각화하였음. 링크 📎