Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 메모리풀
- 비트마스크
- MST
- 조합
- BFS
- 클래스
- lis
- 그리디
- 이분 탐색
- 분할 정복
- Knapsack
- 세그먼트 트리
- dfs
- 순열
- 우선순위 큐
- 빠른 입출력
- 완전 탐색
- 시뮬레이션
- 백트래킹
- 피보나치 수
- 중복 순열
- 크루스칼
- 링크드리스트
- 재귀
- 큐
- BeautifulSoup
- DP
- 스택
- 문자열
- SSAFY
Archives
- Today
- Total
작심 24/7
[백준] 11729번 하노이 탑 이동 순서 본문
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