하노이탑 문제

2025. 5. 5. 15:52·Language/알고리즘

1. C언어 코드

#include <stdio.h>

// 하노이탑 함수
void hanoi(int n, char from, char to, char via) {
    if (n == 1) {
        printf("원판 1을 %c에서 %c로 이동\n", from, to);
        return;
    }

    // 1단계: n-1개를 보조 기둥(via)로 이동 (to는 목표지만 잠깐 보조 역할)
    hanoi(n - 1, from, via, to);

    // 2단계: 가장 큰 원판 1개를 목적지(to)로 이동
    printf("원판 %d을 %c에서 %c로 이동\n", n, from, to);

    // 3단계: n-1개를 보조 기둥에서 목적지로 이동 (from은 이제 보조 역할)
    hanoi(n - 1, via, to, from);
}

int main() {
    int n;
    printf("원판의 개수 입력: ");
    scanf("%d", &n);

    printf("\n하노이탑 이동 순서:\n");
    hanoi(n, 'A', 'C', 'B');
    return 0;
}

 


2. 동작 원리

2.1 하노이탑 문제란?

 

  • 세 개의 기둥(A, B, C)과 크기가 다른 원판 n개가 있다.
  • 처음에는 모든 원판이 A 기둥에 큰 것부터 작은 순서로 쌓여 있음.
  • 모든 원판을 C 기둥으로 옮겨야 함.
  • 조건:
    1. 한 번에 한 개의 원판만 옮길 수 있다.
    2. 큰 원판이 작은 원판 위에 놓일 수 없다.
    3. 항상 위에 있는 원판만 옮길 수 있다.

 

 

2.2 함수 매개변수 의미 

void hanoi(int n, char from, char to, char via)
  • n: 옮겨야 할 원판 개수
  • from: 현재 원판이 쌓여 있는 출발 기둥
  • to: 원판을 옮길 목적지 기둥
  • via: 보조 기둥 (임시로 사용)

 

 

2.3 재귀 동작

기본 아이디어:

  • n개의 원판을 옮기는 문제를, 작은 문제로 나누어 n-1개의 원판을 먼저 옮기고, 마지막으로 큰 원판 하나를 옮긴다.

순서:

  1. n-1개를 보조 기둥으로 옮김
    • 이 때 to는 잠깐 보조 역할을 한다.
hanoi(n - 1, from, via, to);

 

 

2. 가장 큰 원판을 목적지로 옮기기

printf("원판 %d을 %c에서 %c로 이동\n", n, from, to);

 

3. n-1개를 보조 기둥에서 목적지 기둥으로 옮기기

  • 이 때 from 은 보조 기둥 역할을 한다.
hanoi(n - 1, via, to, from);

 

즉, 3개로 기둥을 가정하고 해결하려면 A, B, C 기둥이 있을 때 

모든 원판을 제일 큰 원판 뻬고 n-1개를 B로 옮기고 다시 B 에서 C로 옮기면 된다. 

그 옮기는 중간에서 출발지, 목적지를 제외한 기둥은 보조 기둥이 되는 것이다. 

 

처음에는 이해하기 매우 어려우므로 중단점 걸어놓고 차근차근 코드의 흐름을 분석하면 됨 

저작자표시 비영리 변경금지 (새창열림)

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

유클리드 호제법, GCD, LCM  (0) 2025.04.24
계수 정렬  (0) 2025.04.23
소수 판별 알고리즘: 제곱근 최적화 방식  (0) 2025.04.21
Python deque  (0) 2025.04.08
증가하는 부분 수열 (LIS: Longest Increasing Subsequence)  (0) 2025.04.07
'Language/알고리즘' 카테고리의 다른 글
  • 유클리드 호제법, GCD, LCM
  • 계수 정렬
  • 소수 판별 알고리즘: 제곱근 최적화 방식
  • Python deque
스우스우03
스우스우03
보안 전문가가 되기 위한 노력들
  • 스우스우03
    스우스우
    스우스우03
  • 전체
    오늘
    어제
    • 분류 전체보기 (142)
      • 환경 세팅 및 사용법 (12)
        • 가상환경 (3)
        • Visual Studio Code (3)
        • GitHub (6)
      • Language (17)
        • Python (7)
        • C (2)
        • 알고리즘 (8)
      • Hack&Dev (15)
        • 암호학 (3)
        • Web (11)
        • Pwnable (1)
      • Wargame (88)
        • bandit wargame (42)
        • natas wargame (11)
        • wargame 암호학 (7)
        • Webhacking.kr (26)
        • wargame forensic (1)
        • wargame misc (1)
      • knowledge (8)
        • 기타 지식 (8)
      • 기타... (1)
  • hELLO· Designed By정상우.v4.10.0
스우스우03
하노이탑 문제
상단으로

티스토리툴바