Boj

[Boj] 백준 C++ #1914 하노이탑

ima9ine4 2024. 9. 20. 16:30
728x90

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

📍 알고리즘 분류 : 재귀

📍 문제 풀이 : 알고리즘 시간에 배운 내용과 코드를 기반으로 하노이탑 문제를 풀었다. 옮긴 횟수를 출력하는 것 때문에 시간이 오래 걸렸다. 처음에는 재귀함수가 호출될 때마다 카운트를 해가며 구했는데, N<=20인 경우에는 옮긴 횟수를 출력 후, 수행 과정을 출력해야하므로 옮긴 횟수를 더 먼저 구할 수 있어야 했다. 고민하면서 질문 게시판을 봤는데 다들 카운트가 아닌, 2^n -1로 수행횟수를 구했다. 생각해보니 일반항을 구할 수 있었다.하지만 N이 너무 커질 경우 지수 표기법으로 표기되는 것이 또 문제였는데, string으로 변환 후 소수점 자리를 찾아 잘라주어야 했다. 핵심 알고리즘은 구현했는데 출력 형태를 맞추느라 시간 걸리고 헤매는게 참 별루다.

📍 코드 :

#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;

void Hanoi(int n, int a, int b, int c){
    if(n>0){
        Hanoi(n-1, a, c, b);
        cout<<a<<" "<<c<<'\n';
        Hanoi(n-1, b, a, c);
    }
}

int main() {
    int N; cin>>N;
    
    string tmp = to_string(pow(2,N)); // 결과값 double을 string으로 변환하여 저장
    int dot = tmp.find('.'); // 소수점(.)이 있는 위치를 반환하여 저장
    tmp = tmp.substr(0,dot); // 소수점부터 그 이후는 잘라냄. 소수점 이전의 정수 부분만을 남김
    tmp[tmp.length() - 1] -= 1; // 마지막 문자(char)를 1 감소시킴. 아스키 코드를 1 감소하는 방식.
    cout<<tmp<<'\n';

    if(N<=20){
        Hanoi(N,1,2,3);
    }
    return 0;
}

 

728x90
반응형

'Boj' 카테고리의 다른 글

[Boj] C++ #1339 단어 수학  (2) 2025.01.04
[Boj] 백준 C++ #1202 보석 도둑  (0) 2024.12.27
[Boj] 백준 C++ #11726 2xn 타일링  (0) 2024.08.11
[Boj] 백준 C++ #2667 단지번호붙이기  (0) 2024.08.11
[Boj] 백준 C++ #2309 일곱 난쟁이  (0) 2024.08.08