728x90
문제
떠나기 전까지도 제자들을 생각하셨던 JH 교수님은 재귀함수가 무엇인지 물어보는 학생들을 위한 작은 선물로 자동 응답 챗봇을 준비하기로 했다.
JH 교수님이 만들 챗봇의 응답을 출력하는 프로그램을 만들어보자.
예제 입력
2
예제 출력
어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
____"재귀함수가 뭔가요?"
____"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
____마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
____그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
________"재귀함수가 뭔가요?"
________"재귀함수는 자기 자신을 호출하는 함수라네"
________라고 답변하였지.
____라고 답변하였지.
라고 답변하였지.
해석
굉장히 당황스러운 문제.
파악해야 할 건 3가지다.
1. 어디서부터 재귀로 끊어야하나?
2. ____언더바는 몇개 단위로 반복하나?
3. 마지막 "라고 답변하였지." 를 어떻게 처리해야 하나?
답(개인적인 생각)
1. 첫 호출은 메인함수에서 출력하고, "재귀함수가 뭔가요?" 부터 "그런데 어느 날, ~ 물었어." 부분까지 끊는다.
2. 언더바 _ 는 4개씩 한 묶음이다. 재귀 횟수 만큼 같이 문장앞에 출력해주는 함수를 따로 만든다.
3. 재귀함수 내부에서 목표한 재귀 횟수에 도달하면 재귀 내용을 "라고 답변하였지." 로 대체하도록 한다.
풀이
#include <iostream>
using namespace std;
void PrintLine(int N) // 밑줄 출력함수
{
for (int i = 0; i < N; i++)
{
cout << "____";
}
}
void What_The_Fucking_Recursion(int N, int start, bool end) // 재귀
{
if (start == -1) return; // 시작 지점이 -1 이되면 종료
if (start == N) end = true; // 시작과 목표가 같아지면 마지막 재귀 true
if (start == N) // 시작과 목표가 같아지는 시점에만
{
PrintLine(start);
cout << "\"재귀함수가 뭔가요?\"\n";
PrintLine(start);
cout << "\"재귀함수는 자기 자신을 호출하는 함수라네\"\n";
PrintLine(start);
cout << "라고 답변하였지.\n";
What_The_Fucking_Recursion(N, start - 1, end);
}
else if (end) // 마지막 재귀
{
PrintLine(start);
cout << "라고 답변하였지.\n";
What_The_Fucking_Recursion(N, start - 1, end);
}
else if (end == false) // 목표 숫자까지 반복
{
PrintLine(start);
cout << "\"재귀함수가 뭔가요?\"\n";
PrintLine(start);
cout << "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n";
PrintLine(start);
cout << "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n";
PrintLine(start);
cout << "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n";
What_The_Fucking_Recursion(N, start + 1, end);
}
}
int main()
{
int N; // 주어진 수
cin >> N;
// 첫 호출
cout << "어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n";
cout << "\"재귀함수가 뭔가요?\"\n";
cout << "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n";
cout << "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n";
cout << "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n";
What_The_Fucking_Recursion(N, 1, false);
}
재귀함수에 3가지 변수를 넘겨준다.
N 은 반복할 횟수, 1 은 현재 반복 횟수, false 는 1~N번까지 반복이 끝났는지 확인하는 변수 이다.
따라서 재귀함수는,
재귀할 때 마다 start (현재 반복) 가 1 씩 증가하면서 호출되고,
start 가 N 과 같아지면 bool 변수는 true로 변경된다.
bool 변수가 true인 시점 부터는 새로운 문장을 출력하면서
start 가 1 씩 감소되면서 0 이되는 시점까지 출력한다.
728x90
'백준 알고리즘 단계별 풀이 (문제 수) > 재귀 함수 (5)' 카테고리의 다른 글
[C++] 별 찍기 - 10 : 2447번 (0) | 2022.07.12 |
---|---|
[C++] 피보나치 수 5 : 10870번 (0) | 2022.07.07 |
[C++] 팩토리얼 : 10872번 (런타임 에러 해결) (0) | 2022.07.06 |