본문 바로가기
IT/알고리즘

백준 11729 하노이탑 이동순서 문제

by 어센트 2020. 2. 15.

하노이탑 알고리즘

1.원판이 1개이면 옮기면 종료

2.원판이 n개일때

 1)우1번기둥에 있는 n개의 원반중 n-1개를 2번 기둥으로 옮긴다. (기둥3을 거친다음 기둥2로 옮긴다)

 2)1번 기둥에 남아있는 가장 큰 원판을 3번기둥으로 옮긴다.

 3) 2번기둥에 있는 n-1개의 원반을 다시 3번기둥으로 옮긴다.

 

배운점

  1. 하노이탑 알고리즘을 이해하였다
  2. 원반을 옮길때마다 문자열을 StringBuilder를 활용하여 저장하였다가 마지막에 한번에 출력하는 방법을 배웠다.
  3. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    package 재귀;
     
    import java.util.Scanner;
     
    public class 하노이탑이동순서 {
        public static int cnt = 0;
     
        public static void main(String[] args) {
     
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            StringBuilder sb = new StringBuilder();
            hanoi2(1,2,3,sb,n);
            System.out.println(cnt);
            System.out.println(sb);
     
        }
        public static void hanoi2(int from, int temp, int to, StringBuilder sb, int n) {
            cnt++;
            if (n == 1) { //1번기둥 원반이 하나이면 바로 3번기둥으로 옮긴다. 그리고 종료
                sb.append(from + " " + to+"\n");
                return;
            }
            hanoi2(from, to, temp, sb, n - 1); //N-1 개의 원반을 기둥 3을 거쳐서 (거치기 때문에 기둥3이 temp역할) 기둥2로 옮긴다 (가장 큰 것을 제외한 나머지 원반을 임시 기둥에 놓는것)
            sb.append(from + " " + to+"\n");// 기둥 1에서 1개의 원반을 기둥 3으로 옮긴다. (가장 큰 원반을 옮기는 것)
            hanoi2(temp, from, to, sb, n - 1);// 기둥 2에서 N-1개의 원반을 기둥 3으로 옮긴다. (나머지 원반을 옮기는 것)
        }
        //기본적인 하노이탑 알고리즘
     
        public static void hanoi(int from, int temp, int to, int n) {
            if (n == 1) {
                System.out.println(from + " " + to);
                return;
            }
            hanoi(from, to, temp, n - 1); //N-1 개의 원반을 기둥 3을 거쳐서 (거치기 때문에 기둥3이 temp역할) 기둥2로 옮긴다 (가장 큰 것을 제외한 나머지 원반을 임시 기둥에 놓는것)
            System.out.println(from + " " + to); // 기둥 1에서 1개의 원반을 기둥 3으로 옮긴다. (가장 큰 원반을 옮기는 것)
            hanoi(temp, from, to, n - 1); // 기둥 2에서 N-1개의 원반을 기둥 3으로 옮긴다. (나머지 원반을 옮기는 것)
        }
        //하노이 탑 알고리즘
        // 1. 원반 개수가 1이면 기둥 1에서 기둥 3으로 옮기고 종료
        // 2. 원반 개수가 n개일때
        //1. 1번기둥에 있는 n-1개 원반을 2번기둥으로 옮겨야함 이 떄 3번을 거쳐서 옮긴다
        //2. 1번기둥에 남아있는 가장 큰 원반 1개를 3번기둥으로 옮김
        //3. 2번기둥에 놔뒀던 n-1개의 원반들을 3번기둥으로 옮김
     
        //StringBuilder 사용법에 대해 배움
    }
     
    cs

 

'IT > 알고리즘' 카테고리의 다른 글

백준11650 좌표정렬하기  (0) 2020.02.16
백준 1427 소트인사이드  (1) 2020.02.16
백준 통계학문제 2108 자바  (0) 2020.02.15
백준2775번 부녀회장이될테야  (0) 2020.01.10
백준 10250 ACM호텔  (0) 2020.01.10