본문 바로가기

Algorithm/BAEKJOON

[BOJ] 1914번 하노이 탑 (C++)

728x90
반응형

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

 

1914번: 하노이 탑

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

www.acmicpc.net

 

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
 
void move(int no, int x, int y){
	if(no > 1)
		move(no - 1, x, 6 - x - y); 
	cout << x << " " << y << '\n';
	if(no > 1)
		move(no - 1, 6 - x - y, y);
}
 
int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
    
	int n;
	cin >> n;
	
	string a = to_string(pow(2, n));
	
	int x = a.find('.');     // pow 함수 결과가 실수형이기에 소수점 찾기
	a = a.substr(0, x);      // 소수점 앞자리만 나오게 하기
	a[a.length() - 1] -= 1;  // string a에 대한 마지막 위치의 인덱스 값에 -1
  
	cout << a << '\n';
	
	if(n <= 20)
		move(n, 1, 3);
	return 0;
}

 

하노이 탑에서 원반이 x개일 때 원반 이동 횟수는 2^x - 1이다. 

그런데 20이 넘어가면 int형으로 표현할 수 없기 때문에 문자열을 이용하여 이 문제를 해결했다. 

먼저 2의 n제곱을 문자열로 만든다. pow 함수는 double형이기 때문에 실수가 저장된다. find를 이용하여 소수점을 찾고 substr을 이용하여 소수점 앞자리만 저장되게 한다. 문자열 마지막 인덱스 값에 접근하여 -1을 해준다.

728x90
반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[BOJ] 7576번 토마토 (C++)  (0) 2022.01.28
[BOJ] 2644번 촌수계산 (C++)  (0) 2022.01.28
[BOJ] 10826번 피보나치 수 4 (C++)  (0) 2022.01.11
[BOJ] 10757번 큰 수 A+B (C++)  (0) 2022.01.11
[BOJ] 1010번 다리 놓기 (C++)  (0) 2022.01.10