승1's B(log n)

[백준 - C++] 17478번: 재귀함수가 뭔가요? 본문

Problem Solving

[백준 - C++] 17478번: 재귀함수가 뭔가요?

승1이 2022. 8. 15. 03:03

이 문제는 어렵기보다는 귀찮고, 재귀될 때마다 달라지는 언더바를 어떻게 구현하는지가 중요했던 문제 같다. 

나는 그냥 재귀함수의 파라미터로 n과 k를 받아서 k는 바뀌지 않는 수이자 몇 번의 재귀를 호출할 지 저장하는 수로 사용하고, n은 그 안에서 몇 번째 재귀인지 표시하는 역할로 사용했다. 그렇게 두 가지 인자를 받게 되면 두 가지 인자의 조작을 통해서 언더바와 그 안의 문자열의 개수를 통제할 수 있게 된다.

#include <iostream>
using namespace std;
void Recursive(int n, int k)
{
    if(n == 0)
    {
        for(int i = 0; i < 4 * (k-n); i++)
            cout << "_";
        cout << "\"재귀함수가 뭔가요?\"" << endl;
        for(int i = 0; i < 4 * (k-n); i++)
            cout << "_";
        cout << "\"재귀함수는 자기 자신을 호출하는 함수라네\"" << endl;
        for(int i = 0; i < 4 * (k-n); i++)
            cout << "_";
        cout << "라고 답변하였지." << endl;
    }
    else{
        for(int i = 0; i < 4 * (k-n); i++)
            cout << "_";
        cout << "\"재귀함수가 뭔가요?\"" << endl;
        for(int i = 0; i < 4 * (k-n); i++)
            cout << "_";
        cout << "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어." << endl;
        for(int i = 0; i < 4 * (k-n); i++)
            cout << "_";
        cout << "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지." << endl;
        for(int i = 0; i < 4 * (k-n); i++)
            cout << "_";
        cout << "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"" << endl;
        Recursive(n-1, k);
        for(int i = 0; i < 4 * (k-n); i++)
            cout << "_";
        cout << "라고 답변하였지." << endl;
    }
        
}

int main(void) {
    int N;
    cin >> N;
    cout << "어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다." << std::endl;
    Recursive(N, N);
    return 0;
}

재귀가 중첩될수록 언더바의 반복 횟수가 많아지므로 각 재귀 함수에서 언더바를 (k-n)만큼 호출하되 중첩될수록 n에서 1을 계속 빼는 식으로 호출해줬다. ex) Recursive(n-1, k)이런 식. 그리고 언더바의 개수가 네배씩 증가하므로 for문에서 4*(k-n)을 해줬다. 

그리고 "라고 답변하였지"라는 말은 가장 안쪽 재귀함수에서만 출력이 되므로 그것을 출력하는 조건을 n = 0으로 걸어줬다.

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

 

17478번: 재귀함수가 뭔가요?

평소에 질문을 잘 받아주기로 유명한 중앙대학교의 JH 교수님은 학생들로부터 재귀함수가 무엇인지에 대하여 많은 질문을 받아왔다. 매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대

www.acmicpc.net

 

Comments