![[백준 11729] 하노이 탑 이동 순서 (C/C++)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3jTpy%2FbtrMVuGBQJk%2FUeluiDqsWUZfpMnJoFUsYK%2Fimg.png)
[백준 11729] 하노이 탑 이동 순서 (C/C++)CSE/알고리즘 (algorithm)2022. 9. 23. 23:33
Table of Contents
Problem
https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
Comment
이 문제의 핵심은 두 가지입니다.
- 재귀 함수를 이용해 하노이의 탑 계산의 조건에 맞게 적절한 값 도출
- 원판 이동 횟수 계산
이 문제에서는 아래의 조건에 맞게 원판을 옮겨야 합니다.
- 한 번에 하나의 원판만 옮길 수 있음
- 맨 위에 있는 원판만 옮길 수 있음
- 크기가 작은 원판 위에 큰 원판이 쌓일 수 없음
- 중간의 막대를 임시적으로 이용할 수 있으나 위의 조건들을 지켜야 함
원판을 from
에서 via
를 거쳐 to
까지 옮긴다고 해봅시다.
- $n$개의 원판이
from
에 쌓여있습니다. 먼저, 위에 쌓여있는 $n - 1$개의 원판을via
로 옮깁니다. - 그럼
from
에 제일 밑에 있던 1개의 원판이 남을겁니다. 이 원판을to
로 옮깁니다. via
에 있는 $n - 1$개의 원판을to
로 옮깁니다.
이 과정에서 원판의 횟수를 짐작해볼 수 있습니다. $n - 1$개의 원판을 옮기고, 1개의 원판을 옮기고, $n - 1$개의 원판을 옮긴다고 써져있습니다. 따라서 한 번 사이클이 돌 때마다 $2 * n + 1$개의 원판을 옮기는 것을 알 수 있습니다.
이 점들을 고려하여 코드를 작성하면 아래와 같습니다.
Code
#include <stdio.h>
void hanoi(int from, int via, int to, int n) {
if (n == 1) {
printf("%d %d\n", from, to);
} else {
hanoi(from, to, via, n - 1);
printf("%d %d\n", from, to);
hanoi(via, from, to, n - 1);
}
}
void hanoi_cnt(int n) {
int num = 1;
while (--n) {
num = num * 2 + 1;
}
printf("%d\n", num);
}
int main() {
int n;
scanf("%d", &n);
hanoi_cnt(n);
hanoi(1, 2, 3, n);
}
Result
728x90
반응형
'CSE > 알고리즘 (algorithm)' 카테고리의 다른 글
파이썬에서 시간 복잡도 줄이기 (1) | 2024.06.05 |
---|---|
[알고리즘실습] 2주차 실습과제 (0) | 2023.03.20 |
[백준 2747] 피보나치 수 (C/C++) (0) | 2022.09.23 |
[백준 1629] 곱셈 (C/C++) (0) | 2022.09.23 |
[백준 4949] 균형잡힌 세상 (C++) (0) | 2021.11.17 |
@junyeokk :: 나무보다 숲을
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!