백준/단계별

백준 17478 C#) 재귀함수가 뭔가요?

alpacadabra 2022. 5. 12. 02:45

재귀가 이루어지는 과정을 머릿속에서 그릴 수 있어야 한다.

 

static class Program
{
    static StreamWriter sw;
    static string[] dialogues;
    static int n;

    static Program()
    {
        sw = new(new BufferedStream(Console.OpenStandardOutput()));

        dialogues = new[]
                    {"____",
                     "\"재귀함수가 뭔가요?\"",
                     "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.",
                     "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.",
                     "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"",
                     "\"재귀함수는 자기 자신을 호출하는 함수라네\"",
                     "라고 답변하였지."};

        n = int.Parse(Console.ReadLine());
    }

    static void Main()
    {
        sw.WriteLine("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
        Recursive(0);
        sw.Close();
    }

    static void Recursive(int depth)
    {
        WriteUnderline(depth);
        sw.WriteLine(dialogues[1]); //재귀함수가 뭔가요?

        if (depth == n)
        {
            WriteUnderline(depth);
            sw.WriteLine(dialogues[5]); //재귀함수는 자기 자신을 호출하는 함수라네
        }
        else
        {
            for (int i = 2; i <= 4; i++)
            {
                WriteUnderline(depth);
                sw.WriteLine(dialogues[i]); //잘 들어보게 ~~ 찾아와서 물었어
            }

            Recursive(depth + 1); //재귀
        }

        WriteUnderline(depth);
        sw.WriteLine(dialogues[6]); //라고 답변하였지
    }

    static void WriteUnderline(int depth)
    {
        while (depth-- > 0)
            sw.Write(dialogues[0]);
    }
}

 

재귀는 마치 액자식 구성과도 같다.

외부 이야기의 도중에 내부 이야기가 진행된다. 그리고 내부 이야기가 끝나면 다시 외부 이야기로 돌아온다.

 

이 문제를 액자식 구성에 빗대어보자.

 

1. 외부 이야기가 1번, 내부 이야기가 n번 진행되어야 한다.

첫 문장인 "어느 ~~ 물었다." 는 이야기에 포함되지 않고 외부 이야기는 n의 값에 상관 없이 무조건 한 번은 진행된다.

 

2. n번째 내부 이야기는 내용이 조금 다르고, 이야기마다 재귀 횟수에 비례하여 밑줄이 붙어야 한다.

이를 구현하려면 따로 재귀 횟수를 체크해야 할 것이다.

 

3. 이야기는 항상 "재귀함수가 뭔가요?" 로 시작해 "라고 답변하였지." 로 끝난다.

다음 이야기를 끝내고 돌아오면 "라고 답변하였지." 를 출력해야 할 것이다.

 

구조가 조금 난해할 수 있는 문제이지만 재귀 과정이 잘 표현된 문제이므로 꼭 스스로 풀어보기를 권장한다.