[Python] Baekjoon 백준 11729번 하노이의 탑 이동 순서
[Python] Baekjoon 백준 11729번 하노이의 탑 이동 순서
문제
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.
- 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다.
- 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다.
이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.
아래 그림은 원판이 5개인 경우의 예시이다.
입력
첫째 줄에 첫 번째 장대에 쌓인 원판의 개수 N (1 ≤ N ≤ 20)이 주어진다.
출력
첫째 줄에 옮긴 횟수 K를 출력한다.
두 번째 줄부터 수행 과정을 출력한다. 두 번째 줄부터 K개의 줄에 걸쳐 두 정수 A B를 빈칸을 사이에 두고 출력하는데, 이는 A번째 탑의 가장 위에 있는 원판을 B번째 탑의 가장 위로 옮긴다는 뜻이다.
1번
def hanoi(n, a, c, b):
global k, tmp
if n < 0:
return
if n == 1:
tmp.append(str(a) + " " + str(c))
k += 1
else:
hanoi(n-1, a, b, c)
tmp.append(str(a) + " " + str(c))
k += 1
hanoi(n-1, b, c, a)
k = 0
tmp = []
n = int(input())
hanoi(n, 1, 3, 2)
print(k)
[print(i) for i in tmp]
2번
def hanoi(n, a, c, b):
if n < 0:
return
if n == 1:
print(a, c)
else:
hanoi(n-1, a, b, c)
print(a, c)
hanoi(n-1, b, c, a)
n = int(input())
print(2 ** n - 1)
hanoi(n, 1, 3, 2)
3번
def hanoi(n, start, end):
if n < 0:
return
if n == 1:
print(start, end)
else:
hanoi(n-1, start, 6-start-end)
print(start, end)
hanoi(n-1, 6-start-end, end)
n = int(input())
print(2 ** n - 1)
hanoi(n, 1, 3)
위키백과와 나무위키의 하노이의 탑 구현 코드를 활용하였다
Python 하노이의 탑 구현 코드 1
def hanoi(number_of_disks_to_move, from_, to_, via_):
if number_of_disks_to_move == 1:
print(from_, "->", to_)
else:
hanoi(number_of_disks_to_move-1, from_, via_, to_)
print(from_, "->", to_)
hanoi(number_of_disks_to_move-1, via_, to_, from_)
Python 하노이의 탑 구현 코드 2
def hanoi(n, start, end):
if n == 1:
print(start, end)
else:
hanoi(n-1, start, 6-start-end)
print(start, end)
hanoi(n-1, 6-start-end, end)
아래 c++ 로 문제풀이한 동영상이 많은 도움이 되었다
참고
하노이의 탑 - 위키백과
https://ko.wikipedia.org/wiki/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98_%ED%83%91
하노이의 탑 - 나무위키
https://namu.wiki/w/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98%20%ED%83%91
하노이의 탑 동영상
python
https://www.youtube.com/watch?v=FYCGV6F1NuY
c++
https://www.youtube.com/watch?v=AogMbfRwguk