개발/algorithm

[백준 1914번] 하노이 탑 - python / 재귀

zzi_on2 2022. 4. 29. 22:49

문제 링크

풀이 

하노이탑의 이동 과정은 

1. a에 있는 n-1 개의 원반을 c를 거쳐 b로 옮긴다.

2. a에 남은 가장 아래 있는 원반을 c로 옮긴다. 

3. b로 옮겼던 n-1 개의 원반을 a를 거쳐 c로 옮긴다.

를 따르므로 위 과정을 재귀 함수로 반복해주면 된다. 

 

단, 여기서는 n이 20보다 큰 경우에 메모리 초과가 발생할 수 있으므로

20 이하일 때만 재귀함수를 실행하고 

20보다 클 때는 최소 이동 횟수인 2**n - 1 을 출력하면 된다. 

import sys
input = sys.stdin.readline

def hanoi(n, From, To, Sub):
    if n == 1 :
        answer.append((From,To))
        return 
        
    # From에 있는 n-1 개의 원반을 To를 거쳐 Sub로 옮기기
    hanoi(n-1, From, Sub, To)
    # From에 있는 하나의 원반을 To로 옮기기
    answer.append((From, To))
    # Sub로 옮긴 n-1개의 원반을 From을 거쳐 To로 옮기기 
    hanoi(n-1, Sub, To, From)
    
n = int(input())
answer = []

# n이 20 이하일 때만 실행 
if n <= 20:
    hanoi(n,1,3,2)
    print(len(answer))
    for i in answer:
        print(*i)
else:
    print(2**(n-1))