[자료구조] 순환 알고리즘 하노이 톱 문제코드 분석

지난 글에서 순환과 반복을 이용해 팩트리얼과 피보나치, 거듭제곱값을 구하는 예제를 살펴봤다. 이번 글에서는 순환이라는 놈을 가장 잘 나타내는 하노이 탑의 문제를 다룬다. 하노이 탑 문제 지난 글에서 순환과 반복을 이용해 팩트리얼과 피보나치, 거듭제곱값을 구하는 예제를 살펴봤다. 이번 글에서는 순환이라는 놈을 가장 잘 나타내는 하노이 탑의 문제를 다룬다. 하노이 탑 문제

상기와 같이 막대 A, B, C 세 가지가 있다. 그 중 하나의 막대에는 크기가 모두 다른 64개의 원판이 차례로 쌓여 있으며, 이 원판을 다른 막대로 모두 옮겨야 한다. 원판은 한 번에 하나씩 옮길 수 있으며 절대로 작은 원판 위에 큰 원판을 올릴 수 없다. 64개의 원판을 위 규칙에 맞게 다른 막대기로 모두 옮기려면, 원판을 총 몇 번 옮겨야 하는가? 이것이 하노이 탑의 문제다. 상기와 같이 막대 A, B, C 세 가지가 있다. 그 중 하나의 막대에는 크기가 모두 다른 64개의 원판이 차례로 쌓여 있으며, 이 원판을 다른 막대로 모두 옮겨야 한다. 원판은 한 번에 하나씩 옮길 수 있으며 절대로 작은 원판 위에 큰 원판을 올릴 수 없다. 64개의 원판을 위 규칙에 맞게 다른 막대기로 모두 옮기려면, 원판을 총 몇 번 옮겨야 하는가? 이것이 하노이 탑의 문제다.

원판이 만약 3개일 경우 원판을 7번 움직임으로써 원판 3개를 다른 막대기로 모두 옮기는 데 성공했다. 원판이 4개, 5개 또는 그보다 많을 경우 이보다 훨씬 복잡해진다. 실제로 원판 4개는 15회, 5개는 31회, 6개는 63회 움직이면 모든 원판을 다른 막대기로 옮길 수 있다. 원판이 n개일 때(2n-1)회 움직이면 모든 원판을 다른 막대기로 모두 옮길 수 있는 셈이다. →그렇다면 원판 64개는 (264-1)회 움직이면 된다! 원판이 만약 3개일 경우 원판을 7번 움직임으로써 원판 3개를 다른 막대기로 모두 옮기는 데 성공했다. 원판이 4개, 5개 또는 그보다 많을 경우 이보다 훨씬 복잡해진다. 실제로 원판 4개는 15회, 5개는 31회, 6개는 63회 움직이면 모든 원판을 다른 막대기로 옮길 수 있다. 원판이 n개일 때(2n-1)회 움직이면 모든 원판을 다른 막대기로 모두 옮길 수 있는 셈이다. →그렇다면 원판 64개는 (264-1)회 움직이면 된다!

하노이 탑 문제를 C언어로 구현하기 위해 순환적으로 생각하면 쉽게 해결할 수 있다.· n개의 원판이 쌓여 있을 경우 n-1개의 원판을 먼저 B로 옮긴다. · A의 맨 아래에 있는 원판을 C로 옮긴다. · B에 놓여 있는 n-1개의 원판을 C로 옮긴다. 상기 알고리즘을 바탕으로 구현해 보자. 하노이 탑 문제를 C언어로 구현하기 위해 순환적으로 생각하면 쉽게 해결할 수 있다.· n개의 원판이 쌓여 있을 경우 n-1개의 원판을 먼저 B로 옮긴다. · A의 맨 아래에 있는 원판을 C로 옮긴다. · B에 놓여 있는 n-1개의 원판을 C로 옮긴다. 상기 알고리즘을 바탕으로 구현해 보자.

#<stdio> を含めます。 h> void 하노이_tower(int n, char from, chartmp, char to);int main(void){hanoi_tower(n, ‘A’, ‘B’, ‘C’; return 0;}void 하노이_tower(int n, char from, chartmp, charto){if (n == 1){printf (“원반 1 을 %c %c%c \n)”, from, to);}else {hanoi_tower(n – 1, from, to, tmp);printf(“원반 %d 를 %c 에서 %c 로 이동\n”, n 、에서, to); hanoi_tower(n – 1, tmp, from, to);} #<stdio> を含めます。 h> void hanoi_tower(int n, char from, chartmp, char to);int main(void){hanoi_tower(n, ‘A’, ‘B’, ‘C’); return 0;}void hanoi_tower(int n, char from, chartmp, charto){if (n == 1){printf(“원반 1 을 %c %c %c \n”, from, to);}else {hanoi_tower(n – 1, from, to, tmp);printf(“원반 %d 를 %c 에서 %c 로 이동\n”, n 、 ~ ~ );hanoi_tower(n – 1, tmp, ~ );}

처음에는 이게 무슨 개 같기도 하고, 도대체 무슨 원리로 코드가 작동하는지 궁금해서 코드 실행 순서를 하나씩 분석해보기로 했다. 중간에 많이 헷갈려서 처음부터 다시 보기도 하고, 다음 순서가 뭔지도 잘 모르겠고, 어쨌든 머리를 싸매면서 몇 시간 고민 끝에 답을 얻었다. 처음에는 이게 무슨 개 같기도 하고, 도대체 무슨 원리로 코드가 작동하는지 궁금해서 코드 실행 순서를 하나씩 분석해보기로 했다. 중간에 많이 헷갈려서 처음부터 다시 보기도 하고, 다음 순서가 뭔지도 잘 모르겠고, 어쨌든 머리를 싸매면서 몇 시간 고민 끝에 답을 얻었다.

#<stdio> を含めます。 h> void 하노이_tower(int n, char from, chartmp, char to);int main(void){hanoi_tower(3, ‘A’, ‘B’, ‘C’; return 0;}void 하노이_tower(int n, char from, chartmp, charto){if (n == 1){printf (“원반 1 을 %c %c%c \n)”, from, to); // (라)} 그렇지 않으면 {hanoi_tower(n – 1, from, to, tmp); // (가)printf(“원반 %d 를 %c %c 로 이동”\n”, n 、에서, to); // (나)hanoi_tower(n – 1, tmp, from, to); // (다)}} #<stdio> を含めます。 hanoi_tower(int n, char from, chartmp, char to);int main(void){hanoi_tower(3, ‘A’, ‘B’, ‘C’; return 0;}void hanoi_tower(int n, char from, chartmp, charto){if (n == 1){printf (“원반 1 을 %c %c %c \n)”, from, to); // (라)} 그렇지 않으면 {hanoi_tower(n – 1, from, to, tmp); // (가)printf(“원반 %d 를 %c %c 로 이동”\n”, n 、 ~ ~ ); // (나)hanoi_tower(n – 1, tmp, ~ ); // (다)}}

 

 

이를 아마 n=4일 때 한 번 더 분석하면 머리가 터질 것이다. (한번 해보고 싶은데) 하노이 타워 문제는 코드 하나하나 분석하기보다 n개의 원판이 쌓여 있을 경우 n-1개의 원판을 우선 B로 옮긴다. · A의 맨 아래에 있는 원판을 C로 옮긴다. · B에 놓여 있는 n-1개의 원판을 C로 옮긴다. 위의 원리만 이해하고 넘어가는 것이 정신건강에 좋은 것 같다. 실행 결과 이를 아마 n=4일 때 한 번 더 분석하면 머리가 터질 것이다. (한번 해보고 싶은데) 하노이 타워 문제는 코드 하나하나 분석하기보다 n개의 원판이 쌓여 있을 경우 n-1개의 원판을 우선 B로 옮긴다. · A의 맨 아래에 있는 원판을 C로 옮긴다. · B에 놓여 있는 n-1개의 원판을 C로 옮긴다. 위의 원리만 이해하고 넘어가는 것이 정신건강에 좋은 것 같다. 실행 결과

자료구조 3주차 (2) 드디어 학교진도 따라잡았네요 하노이 탑 문제는 정말 이해하기 힘든 내용이었어요. 개인적으로는 빅오 표기법보다 더 하나의 것이었어요. 그래도 열심히 고민한 끝에 실행 순서를 이해할 수 있어서 너무 기분이 좋았습니다. 실제로 하노이 탑과 씨름하며 두 문장을 작성하다 보니 벌써 해가 저물었는데, 다른 전공 공부는 언제 하는 거야…? 다음 글에서는 C언어의 핵심이라고 할 수 있는 배열, 구조체, 그리고 최종 보스 포인터에 대해 다룹니다. 자료구조에서 가장 중요하게 쓰이는 만큼 저도 실력을 늘려간다는 생각으로 열심히 공부해보겠습니다! 자료구조 3주차 (2) 드디어 학교진도 따라잡았네요 하노이 탑 문제는 정말 이해하기 힘든 내용이었어요. 개인적으로는 빅오 표기법보다 더 하나의 것이었어요. 그래도 열심히 고민한 끝에 실행 순서를 이해할 수 있어서 너무 기분이 좋았습니다. 실제로 하노이 탑과 씨름하며 두 문장을 작성하다 보니 벌써 해가 저물었는데, 다른 전공 공부는 언제 하는 거야…? 다음 글에서는 C언어의 핵심이라고 할 수 있는 배열, 구조체, 그리고 최종 보스 포인터에 대해 다룹니다. 자료구조에서 가장 중요하게 쓰이는 만큼 저도 실력을 늘려간다는 생각으로 열심히 공부해보겠습니다!

error: Content is protected !!