용꿀
꼬마개발자허니
용꿀
전체 방문자
오늘
어제
  • 분류 전체보기 (248)
    • 개발 (75)
      • 스프링 입문 (7)
      • 스프링 기본 (9)
      • ToDo List using JPA (2)
      • 스프링 개념 (9)
      • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (8)
      • 스프링 MVC (3)
      • CS (19)
      • 개발 팁 (8)
      • 스프링 MSA (5)
      • 곰터뷰🐻 (5)
    • 알고리즘 (169)
      • 알고리즘 문제 풀이 (165)
    • 잡동사니 (1)
      • 노래 가사 (1)
hELLO · Designed By 정상우.
용꿀

꼬마개발자허니

(C++) 백준 11729번 - 하노이 탑 이동 순서
알고리즘/알고리즘 문제 풀이

(C++) 백준 11729번 - 하노이 탑 이동 순서

2023. 4. 1. 16:45

문제 링크 : https://www.acmicpc.net/problem/11729

 

11729번: 하노이 탑 이동 순서

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

www.acmicpc.net

풀이

재귀 문제의 대명사격인 하노이 탑 문제이다.

s에서 l로 n개를 이동하려면 다음과 같은 과정을 거치면 된다.

1. 제일 아래에 있는 가장 큰 판을 제외한 n-1개의 판을 s에서 6-s-l로 이동시킨다.

2. 제일 큰 판을 s에서 l로 이동시킨다.

3. 1에서 6-s-l로 이동한 n-1개의 판을 l로 이동시킨다. 

이 과정을 재귀로 반복하여 문제를 풀이하였다.

#include <iostream>

using namespace std;

void hanoi(int s, int l, int n){ // s에서 l로 n개를 이동하려면
    if(n == 1){ // 하나가 남으면 이동하고 이를 출력
        cout << s << " " << l << "\n";
        return;
    }
    hanoi(s, 6-s-l, n-1); // 제일 큰 판을 제외한 n-1개를 s에서 6-s-l로 이동하고
    cout << s << " " << l << "\n"; // 제일 큰 판을 s에서 l로 이동하고
    hanoi(6-s-l, l, n-1); // n-1개를 6-s-l에서 l로 이동
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);  

    int n;
    cin >> n;
    cout << (1<<n)-1 << "\n"; // 판의 개수가 k일 때 2^k-1번 이동
    hanoi(1, 3, n);
}

'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글

(C++) 백준 10026번 - 적록색약  (0) 2023.04.01
(C++) 백준 1074번 - Z  (0) 2023.04.01
(C++) 백준 1629번 - 곱셈  (0) 2023.04.01
(C++) 백준 1697번 - 숨바꼭질  (0) 2023.04.01
(C++) 백준 4179번 - 불!  (0) 2023.03.31
    '알고리즘/알고리즘 문제 풀이' 카테고리의 다른 글
    • (C++) 백준 10026번 - 적록색약
    • (C++) 백준 1074번 - Z
    • (C++) 백준 1629번 - 곱셈
    • (C++) 백준 1697번 - 숨바꼭질
    용꿀
    용꿀

    티스토리툴바