https://www.acmicpc.net/problem/1914
#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
이거보고 이해가 빡감. 설명잘해주시네 좋다
'_BOJ > _C , C++' 카테고리의 다른 글
boj_2579 / 2156 포도주 시식하며 계단 오르기 (0) | 2021.07.24 |
---|---|
BOJ_10815 숫자 카드 c++_머지소트,이진탐색 과 코드를 앞으로 어떻게 짜야 할지 와 내 오답노트. (0) | 2021.07.12 |
[BOJ]11098-첼시를 도와줘! c++ (0) | 2021.01.18 |
codeforces) Goodbye 2020 / A. Bovine Dilemma - c++ (0) | 2020.12.31 |
BOJ_18269 : Where Am I?_ USACO 2019 December Contest > Bronze (0) | 2020.04.09 |