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


문제 풀이
재귀 알고리즘 적용
2022.07.05 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] 재귀(Recursion) 알고리즘
[파이썬으로 배우는 알고리즘] 재귀(Recursion) 알고리즘
재귀(recursion)란? 같은 알고리즘을 사용하여 정의한 알고리즘을 재귀 알고리즘이라고 합니다. 어떠한 역할을 하는 함수에 자기 자신을 다시 호출하여 재귀 알고리즘을 적용할 수 있고, 이러한
c4u-rdav.tistory.com
첫 번째 장대에서 세 번째 장대로 3(n) 개의 원판을 옮기는 과정

1)

2)

3)

4)

5)

6)

7)

- n-1개의 원판을 두 번째 장대에 놓는다. 1) ~ 3)
- 1 개의 원판을 세 번째 장대에 놓는다. 4)
- 두 번째 장대에 있는 n-1개의 원판을 세 번째 장대에 놓는다. 5) ~ 7)
이를 구현하기 위해 재귀 알고리즘을 사용하여 다음과 같이 코드를 작성할 수 있습니다.
# 재귀 알고리즘
# a 장대에서 b 장대로 k-1개를 놓음
dfs(a, c, b, k-1)
# a 장대에서 c 장대로 제일 큰 원판을 놓음
dfs(a, b, c, 1)
# b 장대에서 c 장대로 나머지 k-1개를 놓음
dfs(b, a, c, k-1)
구현
코드
import sys
input = sys.stdin.readline
def dfs(a, b, c, k):
if k == 1:
print(a, c)
return
dfs(a, c, b, k-1)
dfs(a, b, c, 1)
dfs(b, a, c, k-1)
if __name__ == "__main__":
n = int(input())
print(2 ** n - 1)
if n <= 20:
dfs(1, 2, 3, n)
결과

728x90
반응형
'PS > 백준' 카테고리의 다른 글
[백준(BOJ)] #2436- 공약수 (파이썬, PyPy3) (0) | 2022.10.14 |
---|---|
[백준(BOJ)] #1725- 히스토그램 (파이썬, PyPy3) (0) | 2022.10.13 |
[백준(BOJ)] #15997- 승부 예측 (파이썬, PyPy3) (0) | 2022.10.10 |
[백준(BOJ)] #11053- 가장 긴 증가하는 부분 수열 (파이썬, PyPy3) (0) | 2022.08.23 |
[백준(BOJ)] #13459- 구슬 탈출 (파이썬, PyPy3) (0) | 2022.08.20 |