재귀가 이루어지는 과정을 머릿속에서 그릴 수 있어야 한다.
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. 이야기는 항상 "재귀함수가 뭔가요?" 로 시작해 "라고 답변하였지." 로 끝난다.
다음 이야기를 끝내고 돌아오면 "라고 답변하였지." 를 출력해야 할 것이다.
구조가 조금 난해할 수 있는 문제이지만 재귀 과정이 잘 표현된 문제이므로 꼭 스스로 풀어보기를 권장한다.
'백준 > 단계별' 카테고리의 다른 글
백준 2798 C#) 블랙잭 (0) | 2022.05.24 |
---|---|
백준 11729 C#) 하노이 탑 이동 순서 (0) | 2022.05.19 |
백준 10872 C#) 팩토리얼 (0) | 2022.05.12 |
백준 9020 C#) 골드바흐의 추측 (0) | 2022.05.07 |
백준 1929 C#) 소수 구하기 (0) | 2022.05.07 |
댓글