본문 바로가기
Algorithm/📖Baekjoon

#11729 하노이 탑 이동 순서

by yewoneeee 2022. 5. 21.

# 문제

# 입력 및 출력

# 풀이
https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=2gumin14&logNo=221060149259 

 

하노이의 탑과 점화식

안녕하세요. 이번에는 하노이의 탑이라는 것에 대한 이야기를 해 보도록 하겠습니다. 제가 예전에 포스팅한...

blog.naver.com

최소 이동횟수 점화식은 위의 블로그를 보면 잘 정리되어있음

 

하노이탑 원리는 아래 블로그를 보면 정확하게 이해됨

https://shoark7.github.io/programming/algorithm/tower-of-hanoi

 

'하노이의 탑' 이해하기

'하노이의 탑' 문제를 이해하고 문제 해결을 위한 핵심 통찰을 살핀 뒤 코드로 작성합니다. 이후 탑의 개수에 따른 총 이동 횟수를 구하는 일반항까지 수학적으로 유도합니다.

shoark7.github.io

 

일단 하노이탑 원리를 정리하자면

1. N-1개의 원반을 B막대에 옮김

2. 맨 밑 원반을 C막대에 옮김

3. N-1개의 원반을 C막대에 옮김

 

1, 3은 재귀로 처리하면 되고, 2번은 원반 하나를 이동하는 것이기 때문에 재귀 호출은 필요 없음

 

#include <iostream>
#include <cmath>
using namespace std;

void hanoi(int n, int from, int by, int to)
{
	if (n == 1) cout << from << " " << to << "\n";
	else {
		hanoi(n - 1, from, to, by);
		cout << from << " " << to << "\n";
		hanoi(n - 1, by, from, to);
	}
}

int main() {
	int n;
	cin >> n;
	cout << pow(2, n) - 1 << "\n";
	hanoi(n, 1, 2, 3);
}

코드 자체는 문제 없는데 틀렸다고 떠서 당황했다ㅋㅋ

문제를 찾아보니까 pow가 문제였다

double형을 활용하기 때문에 숫자가 커질수록 오차가 발생해서 N에 20이 입력되면 틀렸다고 출력된다

그래서 시프트 연산을 활용했음

 

cout << (1 << n) - 1 << "\n";

시프트 연산의 원리는

여기서 1<<n은 1을 왼쪽으로 n번 시프트 하라는 의민데
0000 0001을 왼쪽으로 3번 시프트 하면 0000 1000이 된다

왼쪽 시프트는 *연산이 되고, 오른쪽 시프는 /연산이 됨

자세한 내용은 아래 블로그 참고

https://dojang.io/mod/page/view.php?id=174 

 

C 언어 코딩 도장: 23.3 시프트 연산자 사용하기

C 언어에서 비트의 논리 연산뿐만 아니라 각 자리를 이동시킬 수도 있습니다. 이번에는 비트의 자리를 이동시켜 보겠습니다. bitwise_shift_operator.c #include int main() { unsigned char num1 = 3; // 3: 0000 0011 uns

dojang.io

 

시프트 연산을 적용하면 아래 코드가 된다

#include <iostream>
#include <cmath>
using namespace std;

void hanoi(int n, int from, int by, int to)
{
	if (n == 1) cout << from << " " << to << "\n";
	else {
		hanoi(n - 1, from, to, by);
		cout << from << " " << to << "\n";
		hanoi(n - 1, by, from, to);
	}
}

int main() {
	int n;
	cin >> n;
	cout << (1 << n) - 1 << "\n";
	hanoi(n, 1, 2, 3);
}

하노이탑 문제는 재귀의 가장 기본적인 문제이기도 하고 변형문제로도 많이 나오니까 원리까지 제대로 알아봤음

 

나한텐 재귀가 넘 어려운 것 같다,,

재귀문제 많이 풀어봐야지

 

'Algorithm > 📖Baekjoon' 카테고리의 다른 글

#4949 균형잡힌 세상  (0) 2022.05.24
#1931 회의실 배정  (0) 2022.05.23
# 11478 서로 다른 부분 문자열의 개수  (0) 2022.05.21
#1269 대칭 차집합  (0) 2022.05.20
#1764 듣보잡  (0) 2022.05.19

댓글