ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 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처럼 노드의 깊이가 끝나는 지점(차수가 가장 높은 지점)에서 로그를 찍는다.

     

    - 재귀 동작원리를 완벽하게 이해해야지만 풀기 쉬운 문제인 것 같았다...

     

    출처: https://www.acmicpc.net/problem/11729

Designed by Tistory.