Search

BOJ 11729 하노이 탑 이동 순서

태그
재귀

문제 설명

세 개의 장대를 이용해 NN개의 원판을 최소 횟수첫 번째 장대에서 세 번째 장대로 옮기는 과정을 출력하는 문제

예제 입력/출력

입력1
3
Python
복사
출력1
7 1 3 1 2 3 2 1 3 2 1 2 3 1 3
Python
복사

제약 조건

1N201 ≤ N ≤ 20

문제 풀이

풀이1 재귀 - O(2N)O(2^N)
핵심 아이디어
1.
가장 큰 원판(N)을 제외한 나머지 N - 1개의 원판을 2번 기둥으로 옮긴다.
2.
가장 큰 원판을 3번 기둥으로 옮긴다.
3.
2번 기둥에 있는 N - 1개의 원판을 목표 기둥으로 옮긴다.
점화식
T(N)=2×T(N1)+1T(N) = 2 \times T(N - 1) + 1
여기서 T(N)T(N)NN개의 원판을 옮기는 최소 이동 횟수
T(1)=1T(1) = 1
시간복잡도
재귀 호출의 깊이가 NN이고, 매 단계마다 두 번의 재귀 호출이 발생하므로, 이동 횟수는 2N12^N - 1
따라서, 시간복잡도는 O(2N)O(2^N)

풀이 코드

def hanoi(a, b, n): # Base Case: 원판이 1개일 때는 바로 목표 기둥으로 이동시킨다. if n == 1: print(a, b) return # 보조 기둥 번호 auxiliary = 6 - a - b ## 1단계: n-1개의 원판을 보조 기둥으로 이동시킨다. hanoi(a, auxiliary, n - 1) ## 2단계: 가장 큰 원판을 목표 기둥으로 이동시킨다. print(a, b) ## 3단계: 보조 기둥에 있는 n-1개의 원판을 목표 기둥으로 이동시킨다. hanoi(auxiliary, b, n - 1) n = int(input()) print(2**n-1) hanoi(1, 3, n)
Python
복사

참고 자료