Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 1003 파이썬
- 6588 파이썬
- 안드로이드 hilt
- 1644 파이썬
- 자료구조
- 10819 파이썬
- 백준 5582
- 1753 파이썬
- 백준 10819
- 1806 파이썬
- android hilt
- 1806 백준
- git local remote
- Android Room
- flow buffering
- 투포인터 알고리즘
- 백준 1644
- 1806 투포인터
- 5582 DP
- 백준 2096
- 코루틴 플로우
- 5582 파이썬
- java
- 자바
- Coroutine Flow
- 2096 파이썬
- 1753 다익스트라
- Android mvp
- 이진 탐색
- Jetpack Room
Archives
- Today
- Total
Gemstone's Devlog
[Data Structure] 하노이 타워 문제 해결 본문
"원반은 한 번에 하나씩만 옮길 수 있습니다. 그리고 옮기는 과정에서 작은 원반의 위에 큰 원반이 올려져서는 안됩니다."
다음과 같은 제약조건을 만족시키기 위해 막대가 두 개가 아닌 세 개가 존재해야 한다.
하노이 타워 문제의 해결
막대 A에 꽂혀있는 원반 n개를 막대 C로 옮기는 과정은 다음과 같이 재귀적으로 구성이 된다.
1. 작은 원반 n-1개를(맨 아래의 원반을 제외한 나머지 원반을) A에서 B로 이동
2. 큰 원반(맨 아래의 원반) 1개를 A에서 C로 이동
3. 작은 원반(위의 1단계에서 옮겨진 원반) n-1개를 B에서 C로 이동
위의 결론을 코드로 옮겨보면,
// from에 꽂혀있는 num개의 원반을 by를 거쳐서 to로 이동
void HanoiTowerMove(int num, char from, char by, char to)
{
. . . .
}
또한, 재귀함수를 정의하는데 있어서 반드시 생각해야 할 것은 재귀의 탈출조건이다.
탈출의 조건은 "이동해야 할 원반의 수가 1개인 경우!" 라고 할 수 있다.
이동해야 할 원반의 수가 1개이면 그냥 옮기면 그만 아닌가? 그래서 이것이 탈출의 조건이 된다.
그럼 함수에 탈출조건을 반영해보겠다.
// from에 꽂혀있는 num개의 원반을 by를 거쳐서 to로 이동
void HanoiTowerMove(int num, char from, char by, char to)
{
if(num == 1) // 이동할 원반의 수가 1개라면
{
printf("원반1을 %c에서 %c로 이동 \n", from, to);
}
else
{
. . . .
}
}
이제 원반 n개를 막대 C로 옮기는 세 개의 과정에 해당하는 코드를 추가하여 코드를 완성해보자.
#include <stdio.h>
// from에 꽂혀있는 num개의 원반을 by를 거쳐서 to로 이동
void HanoiTowerMove(int num, char from, char by, char to)
{
if (num == 1) // 이동할 원반의 수가 1개라면
{
printf("원반1을 %c에서 %c로 이동 \n", from, to);
}
else
{
HanoiTowerMove(num - 1, from, to, by); // 3단계 중 1단계
printf("원반%d을(를) %c에서 %c로 이동 \n", num, from, to); // 3단계 중 2단계
HanoiTowerMove(num - 1, by, from, to); // 3단계 중 3단계
}
}
int main(void)
{
// 막대A의 원반 3개를 막대B를 경유하여 막대C로 옮기기
HanoiTowerMove(3, 'A', 'B', 'C');
// 막대A의 원반 4개를 막대B를 경유하여 막대C로 옮기기
// HanoiTowerMove(4, 'A', 'B', 'C');
return 0;
}
'Data Structure & Algorithms' 카테고리의 다른 글
[백준] 1316번: 그룹 단어 체커 (0) | 2021.08.06 |
---|---|
[백준] 2908번: 상수 (0) | 2021.08.06 |
[백준] 1152번: 단어의 개수 (0) | 2021.08.06 |
[Data Structure] 이진 탐색 알고리즘의 재귀적 구현 (0) | 2021.06.29 |
[Data Structure] 순차 탐색 / 이진 탐색 알고리즘의 연산횟수 비교 (0) | 2021.06.28 |