작심 24/7

[백준] 11729번 하노이 탑 이동 순서 본문

백준

[백준] 11729번 하노이 탑 이동 순서

모닝수박 2020. 5. 20. 03:13
 

11729번: 하노이 탑 이동 순서

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로

www.acmicpc.net

기둥이 A, B, C이고 N이 2개일 때부터 4개일 때까지 순서를 적어나가보면

B에 N-1개의 원반을 쌓아놓은 후 C에 다 옮기는 방식이 공통적으로 나온다. 즉,

1. A -> B 로 N-1개 옮김

2. A -> C 로 1개 옮김 (가장 큰 원반)

3. B -> C 로 N-1개 옮김

이렇게 세 번의 과정으로 나눌 수 있다.

이걸 그대로 재귀함수에 갖다 넣으면 해결된다.

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

void TowerOfHanoi(int from, int middle, int to, int N) {
	if (N != 0) {
		TowerOfHanoi(from, to, middle, N - 1);
		cout << from << " " << to << "\n";
		TowerOfHanoi(middle, from, to, N - 1);
	}
}

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

 

 

이 분 설명이 제일 쉽게 잘 되어 있다.

솔직히 이리저리 규칙을 찾고 조건문으로 해결하려고 애쓰다가 하노이 탑의 규칙을 구글링해서 그 규칙대로 그냥 단순하게 함수에 넣어봤는데 답이 나와서 당황했다.

재귀 문제에 익숙해질 때까지 많이 풀어봐야 할 것 같다.

'백준' 카테고리의 다른 글

[백준] 2108번 통계학  (0) 2020.05.22
[백준] 10989번 수 정렬하기 3  (0) 2020.05.22
[백준] 2447번 별 찍기 - 10  (2) 2020.05.20
[백준] 1002번 터렛  (3) 2020.05.20
[백준] 1929번 소수 구하기  (2) 2020.05.20
Comments