하노이 탑 이동 순서
https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net


하노이탑의 원리는 알겠는데 수행 과정을 출력하는 방법을 생각해봐도 떠오르지 않았다. 함수에 변수를 하나만 넣을 생각을 해서 탑을 옮기는데 어떨 땐 첫 번째 막대에서, 어떨 땐 두 번째 막대에서 이동해야 하는 것을 어떻게 다뤄야 할지 몰랐다.
결국 검색을 통해 답을 알아봤다.
1
2
3
4
5
6
7
8
9
10
11
12
|
def hanoi(n, start, end):
if n == 1:
print(start, end)
return
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)
|
cs |
(출처: https://study-all-night.tistory.com/6)
하노이 탑 이동 과정을 단순하게 표현하면 다음과 같다.

1) n-1개의 탑을 start, end가 아닌 다른 막대에 이동시킨다.
2) 마지막 한 개를 end로 이동시킨다
3) n-1개의 탑을 end로 이동시킨다
여기에서 나는 start, end, 나머지 하나를 어떻게 표현할지 고민하다가 답을 찾지 못했다. 다른 풀이를 보니 다음과 같이 표현했다.
hanoi(n-1, start, 6-start-end)
1, 2, 3번 막대가 있으므로 모두 더한 6에서 start, end를 빼면 옮길 막대를 구할 수 있다.
나는 1->3 이동할땐 이런조합, 2->3 이동할땐 저런 조합으로 따로 코드를 작성해서 알려줘야 된다고 생각했는데 막상 답을 찾아보니 간단해서 놀랐다. print만 사용한 재귀함수에서 저런 형식이 가능하다니 신기했다.
이동 횟수는 (n개블럭이동) = 2*(n-1개블럭이동) + 1 이니까2**n + 1로 표현할 수 있다.(나무위키 참고함)
참고한 페이지https://study-all-night.tistory.com/6
[백준 11729번] 하노이 탑 이동순서 - Python(파이썬) 자세한 풀이
1. 문제 백준 11729번 https://www.acmicpc.net/problem/11729 11729번: 하노이 탑 이동 순서 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓.
study-all-night.tistory.com
알고리즘, 이동횟수https://namu.wiki/w/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98%20%ED%83%91
조금 코드가 다르지만 재귀함수 실행 순서가 나와있음
https://data-jj.tistory.com/34
백준 11729번 : 통곡의 하노이 탑 (feat. python)
BOJ No11729 : 하노이의 탑 이동 순서(파이썬) 과장 없이 이 문제만 하루 종일 10시간 정도 본 것 같다... 아직도 혼자서 처음부터 풀면 막히지만 계속하다 보면 언젠간 이런 종류의 재귀 함수 문제를
data-jj.tistory.com
'알고리즘' 카테고리의 다른 글
백준 알고리즘(파이썬) - 2231번 (0) | 2021.08.23 |
---|---|
백준 알고리즘(파이썬) - 2798번 (0) | 2021.08.23 |
백준 - 2447번 / map(), join() (0) | 2021.08.17 |
백준 - 10870번 (0) | 2021.08.13 |
백준 - 10872번 (0) | 2021.08.13 |