๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Study/Algorithm

[Algorithm/C++] ํ•˜๋…ธ์ด ํƒ€์›Œ ์›๋ฐ˜ ์ด๋™ ํšŸ์ˆ˜ ๊ตฌํ•˜๊ธฐ

2022.09.13 - ์ปดํ“จํ„ฐ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณผ์ œ

  • ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด

 

<3๊ฐœ์˜ ์›๋ฐ˜์ด ์žˆ์„ ๊ฒฝ์šฐ>

  1. ๊ธฐ๋‘ฅ(A, B, C)๊ณผ ์›๋ฐ˜ 3๊ฐœ(์•„๋ž˜๋ถ€ํ„ฐ a, b, c)๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ๋งจ ์•„๋ž˜ ์›๋ฐ˜(a)์„ ์ œ์™ธํ•˜๊ณ  ์œ„์˜ 2๊ฐœ(b, c)์˜ ์›๋ฐ˜๋งŒ ์กด์žฌํ•œ๋‹ค ์ƒ๊ฐํ•œ๋‹ค. (์ฒ˜์Œ ๊ธฐ๋‘ฅ A, ๋ชฉ์ ์ง€ ๊ธฐ๋‘ฅ C)
  2. ๋‹ค์‹œ 2๊ฐœ(b, c)์˜ ์›๋ฐ˜์ด ์žˆ์„ ๊ฒฝ์šฐ, ๋งจ ์•„๋ž˜ ์›๋ฐ˜(b)์„ ์ œ์™ธํ•˜๊ณ  ์œ„์˜ 1๊ฐœ(c)์˜ ์›๋ฐ˜๋งŒ ์กด์žฌํ•œ๋‹ค ์ƒ๊ฐํ•œ๋‹ค.
  3. ์ฒซ๋ฒˆ์งธ ์›๋ฐ˜(c)์„ ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ(C)์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
  4. 2๋ฒˆ์งธ ์›๋ฐ˜(b)์„ ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ(B)์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
  5. ์ฒซ๋ฒˆ์งธ ์›๋ฐ˜(c)์„ 2๋ฒˆ์งธ ์›๋ฐ˜(b) ์œ„๋กœ ์ด๋™์‹œํ‚จ๋‹ค. (b, c ๋ชจ๋‘ B์— ์žˆ์Œ)
  6. ๋งจ ์•„๋ž˜ ์›๋ฐ˜(a)๋ฅผ ๋ชฉ์ ์ง€ ๊ธฐ๋‘ฅ(C)๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
  7. ์ฒซ๋ฒˆ์งธ ์›๋ฐ˜์„ ๋น„์–ด์žˆ๋Š” ๊ธฐ๋‘ฅ(A)์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. (A: c, B: b, C: a)
  8. 2๋ฒˆ์งธ ์›๋ฐ˜(b)์„ ๋ชฉ์ ์ง€ ๊ธฐ๋‘ฅ(C)์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. (c ์œ„์— b ์žˆ์Œ)
  9. ์ฒซ๋ฒˆ์งธ ์›๋ฐ˜(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;
}