문제 06
하노이의 탑 옮기기
원반이 n개인 하노이의 탑을 옮기기 위한 원반 이동 순서를 출력하는 알고리즘을 만들어 보세요.
1. 하노이의 탑
하노이의 탑은 간단한 원반 옮기기 퍼즐입니다.
하노이의 탑에는 크키가 다른 원반이 n개 있고 원반을 끼울 수 있는 기둥이 세 개 있습니다.
하노이의 탑 문제는 어떻게 하면 원반 n개를 모두 가장 왼쪽 기둥(출발점)에서 오른쪽 기둥(도착점)으로 옮길 수 있을까 하는 문제입니다.
단, 하노이의 탑을 옮길 때는 세 가지 제약 사항이 있습니다. 원반은 한 번에 한 개씩만 옮길 수 있고, 각 기둥 맨 위의 원반을 다른 기둥의 맨 위로만 움직여야 합니다.
옮기는 과정에서 큰 원반을 작은 원반 위에 올려서는 안됩니다.
* 하노이의 탑 규칙
- 크기가 다른 원반 n개를 출발점 기둥에서 도착점 기둥으로 전부 옮겨야 합니다.
- 원반은 한 번에 한 개씩만 옮길 수 있습니다.
- 원반을 옮길 때는 한 기둥의 맨 위 원반을 뽑아, 다른 기둥의 맨 위로만 옮길 수 있습니다.
- 원반을 옮기는 과정에서 큰 원반을 작은 원반 위로 올릴 수 없습니다.
2. 하노이의 탑 풀이
- 원반이 한개 일때
1. 1번 기둥에 있는 원반을 3번 기둥으로 옮기면 끝납니다.(1 -> 3)
한 번만에 원하는 곳으로 원반을 옮겼습니다
- 원반이 두개 일때
1. 1번 기둥의 맨 위에 있는 원반을 2번 기둥으로 옮깁니다.(1 -> 2)
2. 1번 기둥에 남아 있는 큰 원반을 3번 기둥으로 옮깁니다.(1 -> 3)
3. 2번 기둥에 남아 있는 원반을 3번 기둥으로 옮깁니다.(2 -> 3)
세 번 만에 원반 두개를 원하는 곳으로 옮겼습니다.
- 원반이 세개 일때
1. 원반이 두개 일때 방식을 통해서 위에 2개를 2번 기둥으로 옮깁니다( 1->3,1->2,3->2)
2. 1번 기둥에 남아 있는 큰 원반을 3번 기둥으로 옮깁니다.(1 -> 3)
3. 이번에는 2번 기둥에 있는 원반 두 개를 3번 기둥으로 옮깁니다. 비어있는 1번 기둥을 활용하여 원반 2개 일때 방식을 통해 옮깁니다( 2->1, 2->3,1->3)
원반을 한개 씩 전부 일곱 번 옮기면 해결됩니다(3+1+3)
- 원반이 n개 일때
1. 1번 기둥에 있는 n-1개 원반을 2번 기둥으로 옮깁니다(n-1개짜리 하노이의 탑 문제 풀기)
2. 2번 기둥에 남아 있는 가장 큰 원반이 3번 기둥으로 옮깁니다(1 -> 3)
3. 2번 기둥에 있는 n-1개 원반을 3번 기둥으로 옮깁니다(n-1개짜리 하노이의 탑 문제 풀기)
3. 하노이의 탑 알고리즘
* 하노이의 탑 알고리즘
1-a 원반이 한 개면 그냥 옮기면 끝입니다(종료 조건)
1-b 원반이 n개 일때
1. 1번 기둥에 있는 n개 원반 중 n-1개를 2번 기둥으로 옮깁니다(3번 기둥을 보조기둥으로 사용)
2. 1번 기둥에 남아 있는 가장 큰 원반을 3번 기둥으로 옮깁니다.
3. 2번 기둥에 있는 n-1개 원반을 다시 3번 기둥으로 옮깁니다(1번 기둥을 보조 기둥으로 사용)
4. 알고리즘 분석
1층짜리 하노이의 탑 원반을 한번 이동
2층짜리 하노이의 탑: 원반을 세번 이동
3층짜리 하노이의 탑 : 원반을 일곱번 이동
n층짜리 하노이의 탑을 옮기려면 원반을 2^n-1번 옮겨야 합니다
따라서 O(2^n)번이 됩니다
'Language > Python' 카테고리의 다른 글
[Python2.7] Tkinter를 이용한 GUI 채팅프로그램 만들기(ver 1) (9) | 2017.08.23 |
---|---|
[ALGORITHMS]문제 07 순차탐색 (0) | 2017.08.22 |
[ALGORITHMS]문제 05. 최대 공약수 구하기 (0) | 2017.08.18 |
[ALGORITHMS]문제 04. 팩토리얼 구하기 (0) | 2017.08.17 |
[ALGORITHMS]문제 03 동명이인 찾기 1 (0) | 2017.08.16 |