-
[Python] BOJ 1914 : 하노이 탑코딩테스트/백준 2024. 9. 8. 17:34
https://www.acmicpc.net/problem/1914
문제는 위 링크 참고.
* 요구사항
- 한번에 한 판만 옮길 수 있다.
- 쌓아 놓은 원판은 항상 위의 것이 아래 보다 작아야 한다.
- 출력 결과 첫 줄에 옮긴 횟수 k 를 출력
- N <= 20 인 경우 수행 과정도 출력
* 설계
- 재귀함수를 이용한다.
- 재귀함수란, 자기 자신을 호출하는 함수를 말한다.
- 그렇기 때문에 base case를 지정해 놓지 않으면 무한히 반복된다.
- 재귀함수란, 자기 자신을 호출하는 함수를 말한다.
- def hanoi (N, start, end, mid)
- 처음 인자를 받을 때, N(판의 개수, 시작점, 끝점(모든 판이 최종적으로 위치하게 될 지점), 중간 지점( 시작점에서 끝점으로 이동할 때, 거치는 지점. 단, base case의 경우는 바로 시작점에서 끝점으로 이동한다.)
- base case : N == 1일 경우
- start(시작점) 에서 end(끝점) 으로 옮긴다.
- 그 외의 경우
- 가장 큰 원판을 제외하고 가운데 모아줘야함.
- 큰 원판을 옮기기 전에 작은 원판들을 다른 곳으로 옮겨서 공간을 만들어야 함.
- 중간에 있던 N -1 개의 원판을 목표 기둥(끝점)으로 이동하는 과정.
- 가장 큰 원판을 제외하고 가운데 모아줘야함.
* 구현
move_count = 0 # Moves tracker def hanoi(N, start, end, mid): global move_count if N <= 20: if N == 1: move_count += 1 print(f"Move {move_count}: {start} -> {end}") return else: hanoi(N-1, start, mid, end) move_count += 1 print(f"Move {move_count}: {start} -> {end}") hanoi(N-1, mid, end, start) hanoi(3,1,3,2)
- 위 코드는 이해를 돕기 위해 작성되었습니다. 백준에 그대로 제출 하시면 안됩니다.
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 1260 : BFS와 DFS (0) 2024.09.19 [Python] BOJ 1920 : 수 찾기 (0) 2024.09.10 [Python] BOJ 9020 : 골드바흐의 추측 (1) 2024.09.08 [Python] 백준 10,818 : 최소, 최대 (0) 2024.06.19 [Python] 백준 3,460 : 이진수 (0) 2024.06.06