2022.09.13 - ์ปดํจํฐ์๊ณ ๋ฆฌ์ฆ ๊ณผ์
- ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ ์๊ณ ๋ฆฌ์ฆ ํ์ด
<3๊ฐ์ ์๋ฐ์ด ์์ ๊ฒฝ์ฐ>
- ๊ธฐ๋ฅ(A, B, C)๊ณผ ์๋ฐ 3๊ฐ(์๋๋ถํฐ a, b, c)๊ฐ ์์ ๊ฒฝ์ฐ, ๋งจ ์๋ ์๋ฐ(a)์ ์ ์ธํ๊ณ ์์ 2๊ฐ(b, c)์ ์๋ฐ๋ง ์กด์ฌํ๋ค ์๊ฐํ๋ค. (์ฒ์ ๊ธฐ๋ฅ A, ๋ชฉ์ ์ง ๊ธฐ๋ฅ C)
- ๋ค์ 2๊ฐ(b, c)์ ์๋ฐ์ด ์์ ๊ฒฝ์ฐ, ๋งจ ์๋ ์๋ฐ(b)์ ์ ์ธํ๊ณ ์์ 1๊ฐ(c)์ ์๋ฐ๋ง ์กด์ฌํ๋ค ์๊ฐํ๋ค.
- ์ฒซ๋ฒ์งธ ์๋ฐ(c)์ ๋ค๋ฅธ ๊ธฐ๋ฅ(C)์ผ๋ก ์ด๋์ํจ๋ค.
- 2๋ฒ์งธ ์๋ฐ(b)์ ๋ค๋ฅธ ๊ธฐ๋ฅ(B)์ผ๋ก ์ด๋์ํจ๋ค.
- ์ฒซ๋ฒ์งธ ์๋ฐ(c)์ 2๋ฒ์งธ ์๋ฐ(b) ์๋ก ์ด๋์ํจ๋ค. (b, c ๋ชจ๋ B์ ์์)
- ๋งจ ์๋ ์๋ฐ(a)๋ฅผ ๋ชฉ์ ์ง ๊ธฐ๋ฅ(C)๋ก ์ด๋์ํจ๋ค.
- ์ฒซ๋ฒ์งธ ์๋ฐ์ ๋น์ด์๋ ๊ธฐ๋ฅ(A)์ผ๋ก ์ด๋์ํจ๋ค. (A: c, B: b, C: a)
- 2๋ฒ์งธ ์๋ฐ(b)์ ๋ชฉ์ ์ง ๊ธฐ๋ฅ(C)์ผ๋ก ์ด๋์ํจ๋ค. (c ์์ b ์์)
- ์ฒซ๋ฒ์งธ ์๋ฐ(c)์ ๋ชฉ์ ์ง ๊ธฐ๋ฅ(C)์ผ๋ก ์ด๋์ํจ๋ค. (๋ชจ๋ C๋ก ์ด๋)
๋๋ณด๊ธฐ
2๊ฐ๋ฅผ ์ฎ๊ธฐ๋ ์์
์ 3๋ฒ
3๊ฐ(1+2๊ฐ)๋ฅผ ์ฎ๊ธฐ๋ ์์
์ 3๋ฒ ...
1๊ฐ = 1๋ฒ
2๊ฐ = 1 * 2 + 1 = 3๋ฒ
3๊ฐ = 2๋ฒ ์ฎ๊ธฐ๋ ๊ฒฝ์ฐ 2๋ฒํ๊ณ 1๋ฒ(๋ง์ง๋ง ์๋ฐ) ์ฎ๊ฒจ
= 3 * 2 + 1 = 7๋ฒ
4๊ฐ = 3๋ฒ ์ฎ๊ธฐ๋ ๊ฒฝ์ฐ 1๋ฒ ํ๊ณ 1๋ฒ ์ฎ๊ฒจ
= 7 * 2 + 1 = 15๋ฒ
5๊ฐ = 4๋ฒ ์ฎ๊ธฐ๋ ๊ฒฝ์ฐ 2๋ฒํ๊ณ 1๋ฒ ์ฎ๊ฒจ
= 15 * 2 + 1 = 31๋ฒ
=> ์๋ฐ n๊ฐ : 2^n - 1 ๋ฒ
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก 5๊ฐ, 10๊ฐ์ ๊ฒฝ์ฐ๋ ๊ตฌํ ์ ์๋ค.
#include <iostream>
using namespace std;
int cnt = 0; // ์ด๋ ํ์์ ์ด์ฉ.
void Hanoi(int n, char from, char temp, char to)
// n : ์๋ฐ๊ฐ์, from : ์๋ ์์น, temp : ์์ ์ฅ์, to :๋ชฉ์ ์ง
{
// ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์
// ......
if (n == 1) { // ์๋ฐ์ด 1๊ฐ๋ผ๋ฉด
cnt++; // ์ด๋ ํ์ 1์ฆ๊ฐ
return;
}
else {
cnt++; // ์ด๋ ํ์ 1์ฆ๊ฐ
Hanoi(n - 1, from, to, temp); // ์๋ฐ๋ณด๋ค ํ๋ ์ ์ n-1๊ฐ์ ์๋ฐ์ ์์ ์ฅ์๋ก ์ด๋
Hanoi(n - 1, temp, from, to); // ์์ ์ฅ์๋ก ์ด๋์ํจ ์๋ฐ์ ๋ชฉ์ ์ง๋ก ์ด๋
}
}
void main()
{
int n; //์๋ฐ์ ์
cout << "์๋ฐ์ ๊ฐฏ์๋ฅผ ์
๋ ฅํ์ธ์ : ";
cin >> n;
Hanoi(n, 'A', 'B', 'C'); // n๊ฐ์ ์๋ฐ์ 'A'์์ 'C'๋ก ์ด๋
cout << "์ ์ฒด ์๋ฐ ์ด๋ ์(์๋ฐ์ : " << n << ") = " << cnt << endl;
}