반응형
리뷰
https://www.acmicpc.net/problem/11729
기본적인 재귀 문제인 하노이 탑의 이동 순서 문제, 경로를 체크해야 하므로 직접 재귀를 돌려야 한다.
전역 변수
- n : 옮겨야 할 원판의 개수를 저장할 변수
- path : 원판을 옮기는 순서를 저장하기 위한 pair<int, int>타입의 벡터
함수
1. hanoi
void hanoi(int n, int from, int to, int aux)
재귀를 통해 1번 장대에서 3번 장대로 원판을 모두 옮기기 위한 함수
- 매개변수로 옮길 원판의 개수 n, 시작 지점 from, 도착 지점 to, 임시 장대 aux를 매개변수로 받는다.
- 기저 조건으로 원판이 한개만 남은 경우 path에 from, to를 추가해 주고 리턴해 준다.
- n - 1개의 원판을 to를 임시 장대로 사용해 from에서 aux로 이동해 준다.
- 재귀를 빠져나오며 path에 from, to를 추가해 준다.
- 다시 재귀를 진행하며 n - 1개의 원판을 from을 임시 장대로 사용해 aux에서 to로 이동해 준다.
문제풀이
- n값을 입력 받고 hanoi함수에 초기값 n, 1, 3, 2를 매개변수로 전달하여 호출한다.
- 재귀 탐색을 마친 후 path의 size를 먼저 출력해 준 뒤 줄바꿈을 진행해 준다.
- path에 저장된 이동 정보를 한줄에 한 개씩 출력해 준다.
트러블 슈팅
없음
참고 사항
- 하노이 탑 이동 순서 문제의 정답은 항상 2^n - 1의 값을 가진다.
정답 코드
#include <iostream>
#include <vector>
using namespace std;
int n;
vector<pair<int, int>> path;
void hanoi(int n, int from, int to, int aux) {
if (n == 1) {
path.push_back({ from, to });
return;
}
hanoi(n - 1, from, aux, to);
path.push_back({ from, to });
hanoi(n - 1, aux, to, from);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
hanoi(n, 1, 3, 2);
cout << path.size() << "\n";
for (const auto& i : path) cout << i.first << " " << i.second << "\n";
return 0;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[P5] 백준 1306번 달려라 홍준 C++ 세그먼트 트리, 슬라이딩 윈도우 (0) | 2024.12.31 |
---|---|
[P5] 백준 27989번 가장 큰 증가하는 부분 수열 2 C++ 세그먼트 트리 (0) | 2024.12.30 |
[G1] 백준 6213번 Balanced Lineup C++ 세그먼트 트리 (0) | 2024.12.28 |
[S1] 백준 30406번 산타 춘배의 선물 나눠주기 C++ 그리디 알고리즘 (0) | 2024.12.27 |
[G5] 백준 17485번 진우의 달 여행 (Large) C++ 다익스트라 (0) | 2024.12.27 |