![[백준 / BOJ] 11729번 하노이 탑 이동 순서 (C++, Python)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiNq6K%2FbtrJm8honev%2FoC5edCbaVPxKrk9wgPKig1%2Fimg.png)
[백준 / BOJ] 11729번 하노이 탑 이동 순서 (C++, Python)◎ 자료구조와 알고리즘/백준(BOJ) 문제풀이2022. 4. 10. 21:39
Table of Contents
반응형
링크 : https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
문제

문제 풀이
재귀로 풀지 않으면 접근 방식이 참 어려울 것 같은 문제다.
찬찬히 생각해보면, 이동 과정을 통째로
i) n-1개의 원판을 2번째 장대로 옮긴다.
ii) 제일 밑에 있는 원판을 3번째 장대로 옮긴다.
iii) 2번째 장대에 있는 원판들을 3번째 장대로 옮긴다.
라고 요약할 수 있다. ii)번째 과정을 생각해보자. 이는
1) 2번째 장대의 맨 마지막 원판을 제외한 원판들을 1번째 장대에 옮긴다.
2) 2번째 장대의 맨 마지막 원판을 3번째 장대에 옮긴다.
3) 1번째 장대에 있던 원판들을 3번째 장대에 옮긴다.
인데, 이는 재귀적으로 구현할 수 있다. 결국 일련의 과정이 막대의 위치만 달라졌을 뿐 원래의 문제의 축소된 형태이기 때문이다.
C++ 코드 전문
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
// 순서대로 start, mid, end 장대라고 가정하자. | |
// 하노이탑 과정을 통째로 생각하면, n-1개의 원판을 mid에 옮기고 | |
// 나머지 원판을 end로 옮기고, 다시 mid에 있는 원판들을 end에 옮기면 된다. | |
void solution(int N, int start, int mid, int end) { | |
if (N == 1) | |
cout << start << " " << end << "\n"; | |
else { | |
solution(N - 1, start, end, mid); | |
cout << start << " " << end << "\n"; | |
solution(N - 1, mid, start, end); | |
} | |
} | |
int main() { | |
int N; | |
cin >> N; | |
cout << (1 << N) - 1 << "\n"; | |
solution(N, 1, 2, 3); | |
return 0; | |
} |
Python 코드 전문
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
// 순서대로 start, mid, end 장대라고 가정하자. | |
// 하노이탑 과정을 통째로 생각하면, n-1개의 원판을 mid에 옮기고 | |
// 나머지 원판을 end로 옮기고, 다시 mid에 있는 원판들을 end에 옮기면 된다. | |
void solution(int N, int start, int mid, int end) { | |
if (N == 1) | |
cout << start << " " << end << "\n"; | |
else { | |
solution(N - 1, start, end, mid); | |
cout << start << " " << end << "\n"; | |
solution(N - 1, mid, start, end); | |
} | |
} | |
int main() { | |
int N; | |
cin >> N; | |
cout << (1 << N) - 1 << "\n"; | |
solution(N, 1, 2, 3); | |
return 0; | |
} |
소감
반응형
'◎ 자료구조와 알고리즘 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 / BOJ] 2231번 분해합 (C++, Python) (0) | 2022.04.11 |
---|---|
[백준 / BOJ] 2798번 블랙잭 (C++, Python) (0) | 2022.04.11 |
[백준 / BOJ] 2447번 별 찍기 - 10 (C++, Python) (0) | 2022.04.10 |
[백준 / BOJ] 10870번 피보나치 수 5 (C++, Python) (0) | 2022.04.10 |
[백준 / BOJ] 10872번 팩토리얼 (C++, Python) (0) | 2022.04.09 |
@Reo :: 코드 아카이브
자기계발 블로그