본문 바로가기

_BOJ/_C , C++

BOJ_1914 하노이 탑 c++ 재귀 string to_string substr

반응형

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

 

1914번: 하노이 탑

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

www.acmicpc.net

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

//global Var
int n; //amounts of block.

//functions
void hanoi(int n, int a, int b, int c);

//main
int main(){
    cin >> n;
    string s = to_string(pow(2, n));
    int finddot = s.find('.');
    s = s.substr(0,finddot);
    s[s.length() -1] -= 1;
    cout << s << '\n';
    if(n<=20){
       hanoi(n,1,3,2);
    }
    return 0;
}

void hanoi(int n, int start, int end, int temp){ // n개 블럭, 시작, 목표, 임시기둥
    if(n==1){
        cout << start << " " << end << "\n";
        return;
    }
    else{
        hanoi(n-1, start, temp, end); //n 말고 모두 temp로
        cout << start << " " << end << "\n";
        hanoi(n-1, temp, end, start); //temp를 다시 end으로 보내기
    }
}

void hanoi(int n, int start, int end, int temp){ // n개 블럭, 시작, 목표, 임시기둥
    if(n==1){
        cout << start << " " << end << "\n";
        return;
    }
    else{
        hanoi(n-1, start, temp, end); //n 말고 모두 temp로
        cout << start << " " << end << "\n";
        hanoi(n-1, temp, end, start); //temp를 다시 end으로 보내기
    }
}

이부분이 핵심이다.
n==1이면 그냥 start가 end로 가고 끝난다.
하지만 1이 아니라면
n에서 1을 빼고, 그럼 그 나머지 배열들을 모두  temp로 보내줄 때 까지 연산을 한다고 가정하는것이다.
가정이 포인트임
그니까 n 기준으로 n-1 , -2 , -3 ... 들이 다 temp로 들어가야 한다는 뜻이고
else의 첫번째 문장이 그 역할을 한다.
그러면 cout이 자기 할일을 하고.

그 마지막줄은 temp에 있는게 end로 가게 한다.

***셤보고 추가할것

그다음 출력문이다.

string s = to_string(pow(2, n)); 

    int finddot = s.find('.');

    s = s.substr(0,finddot);

    s[s.length() -1] -= 1;

    cout << s << '\n';

pow가 제곱인데 이건 double 형이니까 일단 string s 로 변환해서 담아둔다.

double 이면 xxxxxx . xxxxxxx 이기에 . 까지 칸수를 세서 finddot 변수에 담아둔다.

그다음에 substr 으로 소숫점 까지 읽어오고

소숫점이 붙은 값을 빼주고 소숫점 아랫 값도 빼줘서

딱 원하는 공식 값만 출력을 하는 것이다.

 

이해하면 쉬운데 이해하기가 어려웠다.

뇌에서 정리가 안됐었음. 

아무튼 클리어 아무튼.

 

++)

https://www.youtube.com/watch?v=uSSC0aKXbWQ 

이거보고 이해가 빡감. 설명잘해주시네 좋다

반응형