https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
[소스코드]
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
// [baekjoon] 11729번 - 하노이 탑 이동 순서
// 2023.01.31
string str;
void hanoi(int n, char from, char aux, char to) {
if (n == 1) {
cout << from << " " << to << "\n";
return;
}
hanoi(n - 1, from, to, aux);
cout << from << " " << to << "\n";
hanoi(n - 1, aux, from, to);
}
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
int n;
cin >> n;
cout << (int)pow(2, n) - 1 << '\n';
hanoi(n, '1', '2', '3');
return 0;
}
재귀를 이용하여 하노이탑 문제를 풀어내는 방법은 많이 알려져 있습니다.
다만 이 문제에서는 가장 먼저 옮긴 횟수 K를 물어보는데요,
재귀 과정에서 K를 계산하려고 하면 굉장히 어려워 집니다.
해결 방법은 간단합니다.
하노이탑의 최소 이동횟수 K = 2^n - 1
이라는 사실을 이용하면 재귀 과정에서 K를 굳이 세지 않아도 쉽게 풀 수 있습니다.
'학습 정리 > 👨💻 PS Study' 카테고리의 다른 글
[C++] 프로그래머스 - 달리기 경주 (0) | 2023.05.19 |
---|---|
[C++] 프로그래머스 - 성격 유형 검사하기 (0) | 2023.05.15 |
[C++] 백준 2108번 - 통계학 (0) | 2023.01.22 |
[C++] 백준 11650번 - 좌표 정렬하기 (0) | 2023.01.22 |
[C++] 백준 1181번 - 단어 정렬 (0) | 2023.01.04 |