katte
개발새발 우주정복기
katte
전체 방문자
오늘
어제
  • 분류 전체보기 (73)
    • 블로그 소개 (1)
    • Computer (36)
      • 자료구조 (0)
      • 알고리즘&백준 (19)
      • 컴퓨터구조 (0)
      • C++ (17)
      • Kotlin (0)
    • EE (29)
      • Verilog (22)
      • 디지털 시스템 (2)
      • 집적회로설계 (1)
      • 임베디드 시스템 (4)
    • 토이프로젝트 (3)
    • 기타 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • cin
  • for 루프
  • EOF
  • C++ 스트림 개요
  • 입력버퍼
  • 함수포인터
  • 표준스트림
  • 스트림
  • C언어
  • c++
  • C++ 스트림 클래스
  • Get
  • C++11
  • ctime
  • ignore
  • c++ 입출력
  • 배열포인터
  • cctype

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
katte

개발새발 우주정복기

Computer/알고리즘&백준

[백준] [C++] 11729 하노이 탑 이동 순서

2022. 11. 15. 13:13

https://www.acmicpc.net/problem/11729

 

11729번: 하노이 탑 이동 순서

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로

www.acmicpc.net

 

 

재귀를 이용하는 문제다.

 

단계별 풀기를 하고 있는데, 아직 이 문제를 풀 순서는 아니지만 재귀 배운 김에 풀어봤다. 

 

 

 

이 문제의 핵심 포인트는 다음과 같다.

 

n개의 원반을 A에서 C로 옮기기 위해서는 n-1개의 원반을 A에서 B로 옮기고, 가장 밑의 원반을 A에서 C로 옮긴 후, 다시 n-1개의 원반을 B에서 C로 옮겨야 한다.

 

따라서 재귀로 귀결되는 것이다.

 

사실 이 문제는 너무 유명한 문제이기도 하고 인터넷에 검색하면 자료가 넘치기 때문에 더 이상 자세히 설명하지는 않겠다.

 

 

 

근데 사실 나도 이미 다른 코드를 본 다음 풀어서 쉽게 푼 거지 아예 이 문제를 접해본 적이 없는 상태로 풀었으면 어려웠을 것 같긴 하다.

 

#include <iostream>

void hanoi(int n, int from, int by, int to)
{
	if (n == 1)
	{
		std::cout << from << ' ' << to << '\n';
	}
	else
	{
		hanoi(n - 1, from, to, by);
		std::cout << from << ' ' << to << '\n';
		hanoi(n - 1, by, from, to);
	}
}

int hanoiCnt(int n)
{
	if (n == 1) return 1;
	return 2 * hanoiCnt(n - 1) + 1;
}

int main()
{
	int n;
	std::cin >> n;
	std::cout << hanoiCnt(n) << '\n';
	hanoi(n, 1, 2, 3);
}

 

 

이 문제는 원반을 옮긴 횟수를 가장 먼저 출력해야 하기 때문에, 이동 횟수를 세는 재귀함수를 따로 만들었다. 

 

 

 

 

 

 

저작자표시 (새창열림)

'Computer > 알고리즘&백준' 카테고리의 다른 글

[백준][알고리즘][C++] 2750 수 정렬하기, 버블 정렬, 삽입 정렬  (0) 2022.11.19
[백준][C++] 2738 행렬 덧셈  (0) 2022.11.16
[알고리즘] 시간복잡도와 공간복잡도, 빅-오(Big-Oh) 표기법  (0) 2022.11.15
[백준] [C++] 9020 골드바흐의 추측  (0) 2022.11.14
[백준] [C++] 4948 베르트랑 공준  (0) 2022.11.13
    'Computer/알고리즘&백준' 카테고리의 다른 글
    • [백준][알고리즘][C++] 2750 수 정렬하기, 버블 정렬, 삽입 정렬
    • [백준][C++] 2738 행렬 덧셈
    • [알고리즘] 시간복잡도와 공간복잡도, 빅-오(Big-Oh) 표기법
    • [백준] [C++] 9020 골드바흐의 추측
    katte
    katte
    개발새발 코딩하는 블로그 / HW 위주

    티스토리툴바