본문 바로가기
algorithm/coding

하노이탑 문제 풀기

by 무대포 개발자 2020. 11. 5.
728x90
반응형

하노이탑 문제 풀기


import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Hanoi {
    public static void main(String[] args) {
        int count = hanoi(3, 1, 2, 3, 0);
        log.info("{}", count);
        count = hanoi(4, 1, 2, 3, 0);
        log.info("{}", count);
    }

    /**
     * 하노이탑 원리를 이해해야 함.
     * 1. n-1 를 두번째 기둥으로 옮기고.
     * 2. 첫번째 기둥에서 마지막 원판을 세번째 기둥으로 옮긴다.
     * 3. 두번째 기둥에 있는 n-1 원판을 세번째 기둥으로 옮긴다.
     *
     * 위 내용을 보면 n 번쨰 기둥을 옮기는건 n-1 번째 기둥을 옮기는 것을 풀어야 풀 수 있는 문제이다.
     * 즉, 재귀 문제이다.
     *
     * 제일 작은 문제부터 시작해보자.
     * n = 1 일 때는 1번 움직이기.
     * n = 2 일 때는 1 --> 2, 1 --> 3, 2 --> 3 (3번)
     * n = 3 일 때는 n-1 을 2번째 기둥으로 옮기는데 3번이 소요, 1 --> 3, n - 1 을 3번째 기둥으로 옮김.  (총 7번)
     * n = 4 일 때는 n-1 을 2번째 기둥으로 옴기는데 7번, 1 --> 3, n - 1 을 3번째 기둥으로 옮기는데 7번. (총 15번)
     *
     *
     * @param n     원판갯수
     * @param from  시작
     * @param mid   경유지
     * @param to    목적지
     */
    public static int hanoi(int n, int from, int mid, int to, int count) {
        if (n == 1) {
            log.info("from : {} --> to : {}", from, to);
            count++;
            return count;
        }

        /** 위에 1번을 뜻함. */
        count = hanoi(n - 1, from, to, mid, count );

        /** 위에 2번을 뜻함. */
        log.info("from : {} --> to : {}", from, to);
        count++;
        /** 위에 3번을 뜻함. */
        count = hanoi(n-1, mid, from, to, count);

        return count;
    }
}

'algorithm > coding' 카테고리의 다른 글

소수 판별 문제  (0) 2020.07.10
java factorial 구현 (recursion, forloop 비교)  (0) 2020.07.08

댓글