아임'준
[BOJ / 파이썬] 11729: 하노이 탑 이동 순서 본문
백준 / BOJ / Python / 파이썬
문제 링크 : https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
단계 : 재귀
알고리즘 분류 : 재귀
풀이:
재귀 하면 떠오르는 대표적인 문제 중 하나인 하노 이탑이다. 하노이 탑은 1, 2, 3번 기둥을 이용하여 1번 기둥에 있던 탑을 3번 기둥으로 원판 순서에 맞게 옮기는 문제이다.
해당 문제를 풀기 위해서는 "어떻게 하면 하노이탑을 옮길 수 있는가?"를 생각해야 한다. 하노이 탑에서 중요한 점은 크기가 큰 원판이 크기가 작은 원판의 위에 놓이지 못한다는 것이다. 이를 생각해볼 때 n개의 원판이 있을 때(작은 것부터 1 ... 가장 큰게 n) 가장 먼저 3번 기둥에 자리잡아야 하는 것은 n번째 원판이며 그 위로는 n-1번째 원판이 놓여야 한다.
이를 잘 생각해보면 높이 n의 하노이 탑이 3번 기둥에 옮겨가기 위해서는 높이 n-1의 하노이 탑이 먼저 2번 기둥에 옮겨가야한다. 이러한 점을 이용하여 우리는 n번째 원판을 src(출발지)에서 dst(도착지)로 옮기는 과정을 하기 전에 n-1번째 원판을 출발지에서 temp(나머지 : 기둥 번호의 합이 1+2+3 = 6 이므로 6에서 src와 dst를 빼면 남은 기둥의 번호를 구할 수 있다)옮겨야 한다. 해당 과정이 완료되면 n번째 원판을 dst로 옮길 수 있는 것이니 그때 print를 해주며 그 이후 n 기준 temp의 위치에 쌓여있는 n-1 높이의 탑을 dst로 옮겨주기 위해 재귀 함수를 사용한다.
코드
def hanoi(n, src, dst):
temp = 6 - src - dst
if n == 0:
return
hanoi(n - 1, src, temp)
print(src, dst)
hanoi(n - 1, temp, dst)
n = int(input())
print(pow(2, n) - 1)
hanoi(n, 1, 3)
'문제풀이 > BOJ' 카테고리의 다른 글
[BOJ / 파이썬] 10989: 수 정렬하기 3 (0) | 2021.10.05 |
---|---|
[BOJ / 파이썬] 2751: 수 정렬하기 2 (0) | 2021.10.04 |
[BOJ / 파이썬] 2447번: 별 찍기 - 10 (2) | 2021.10.03 |
[BOJ / 파이썬] 4948번: 베르트랑 공준 (0) | 2021.08.03 |
[BOJ / 파이썬] 1929번: 소수 구하기 (0) | 2021.08.02 |