반응형
[BOJ][C++] 11729 하노이 탑 이동 순서
문제
https://www.acmicpc.net/problem/11729
풀이
분할 정복 알고리즘을 이용해서 푸는 문제입니다. 수학적 귀납법을 이용해 증명을 해보면 규칙을 발견할 수 있습니다.
가장 먼저 출력해야 하는 이동 값은 2^n-1 입니다. 처음에 이를 math.h를 이용해서 출력하려 했는데 시간 초과가 떠서 쉬프트 연산자를 활용하여 출력했습니다.
어렵다는 생각이 들어서 case 4까지 직접 노트에 적어가면서 탑 이동을 해보았습니다.
case 1 |
case 2 |
case3 |
case4 |
1->3 |
1->2 ----------------- 1->3 ----------------- 2->3 |
1->3 1->2 3->2 ----------------- 1->3 ----------------- 2->1 2->3 1->3 |
1->2 1->3 2->3 ------- 1->2 ------- 3->1 3->2 1->2 ----------------- 1->3 ----------------- 2->3 2->1 3->1 ------- 2->3 ------- 1->2 1->3 2->3 |
"1번위치"에서 "3번위치"로 옮긴다고 할 때, 쪼개어보면 1~n-1까지의 탑을 2번으로 옮기고 n(맨 아래 원판)을 3번으로 옮깁니다. 다만, n값이 커지면서 케이스가 쪼개지는 것을 볼 수 있습니다. 이를 재귀를 활용하여 구하면 됩니다.
hanoi(출발지, 목적지, count값) 으로 코드를 짜면 아래와 같습니다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <cstdio> int n; void hanoi(int x, int y, int count) { if (!count) return; hanoi(x, 6 - x - y, count-1); printf("%d %d\n", x, y); hanoi(6 - x - y, y, count-1); } int main() { scanf("%d", &n); printf("%d\n", (1 << n) - 1); hanoi(1, 3, n); return 0; } | cs |
반응형
'Language > C++' 카테고리의 다른 글
[C++] call by value 와 call by reference (0) | 2019.03.07 |
---|---|
[BOJ][C++] 1436 영화감독 숌 (0) | 2018.12.17 |
[C++][BOJ] 1018 체스판 다시 칠하기 (0) | 2018.12.14 |
[BOJ][C++] 2839 설탕옮기기 (0) | 2018.12.12 |
[C++][오류] 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. (0) | 2018.12.11 |
댓글