-
[백준 11729] 하노이 탑 이동 순서코딩테스트 문제풀이 2021. 12. 17. 15:35
문제
풀이
import java.util.Scanner; public class Main { public static int moveCount = 0; public static StringBuffer sb = new StringBuffer(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.close(); hanoi(1,2,3,n); System.out.println(moveCount); System.out.println(sb.toString()); } public static void hanoi(int from, int middle, int to, int n) { if (n == 0) return; moveCount++; hanoi(from, to, middle, n-1); sb.append(from + " " + to + "\n"); hanoi(middle, from, to, n-1); } }
n = 3일때,
1. hanoi(1,2,3,3)
2. hanoi(1,3,2,2)
3. log: 1 3 // 네번째 로그
4. hanoi(2,1,3,2)
// 2번의 재귀
5. (2-1) hanoi(1,2,3,1)
6. (2-2) log: 1 2 // 두번째 로그
7. (2-3) hanoi(3,1,2,1)
// 4번의 재귀
8. (4-1) hanoi(2,3,1,1)
9. (4-2) log: 2 3 // 여섯번째 로그
10. (4-3) hanoi(1,2,3,1)
// 5번의 재귀
11. (5-1) hanoi(1,3,2,0)
12. (5-2) log: 1 3 // 첫번째 로그
13. (5-3) hanoi(2,1,3,0)
// 7번의 재귀
14. (7-1) hanoi(3,2,1,0)
15. (7-2) log: 3 2 // 세번째 로그
16. (7-3) hanoi(1,3,2,0)
// 8번의 재귀
17. (8-1) hanoi(2,1,3,0)
18. (8-2) log: 2 1 // 다섯번째 로그
19. (8-3) hanoi(3,2,1,0)
// 10번의 재귀
20. (10-1) hanoi(1,3,2,0)
21. (10-2) log: 1 3 // 일곱번째 로그
22. (10-3) hanoi(2,1,3,0)
- 재귀함수 호출시, 재귀가 중단되기 전까지(n == 0일 때 중단)는 다음 실행 코드로 넘어가지 않는다.
- DFS처럼 노드의 깊이가 끝나는 지점(차수가 가장 높은 지점)에서 로그를 찍는다.
- 재귀 동작원리를 완벽하게 이해해야지만 풀기 쉬운 문제인 것 같았다...
'코딩테스트 문제풀이' 카테고리의 다른 글
[백준 1018] 체스판 다시 칠하기 (0) 2021.12.22 [백준 7568] 덩치 (1) 2021.12.22 [백준 17478] 재귀함수가 뭔가요? (1) 2021.12.14 [백준 10870] 피보나치 수 5 (1) 2021.12.14 [프로그래머스] 표 편집 (0) 2021.10.14