https://www.acmicpc.net/problem/17478
문제
> 평소에 질문을 잘 받아주기로 유명한 중앙대학교의 JH 교수님은 학생들로부터 재귀함수가 무엇인지에 대하여 많은 질문을 받아왔다.
> 매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대학교가 자신과 맞는가에 대한 고민을 항상 해왔다.
> 중앙대학교와 자신의 길이 맞지 않다고 생각한 JH 교수님은 결국 중앙대학교를 떠나기로 결정하였다.
> 떠나기 전까지도 제자들을 생각하셨던 JH 교수님은 재귀함수가 무엇인지 물어보는 학생들을 위한 작은 선물로 자동 응답 챗봇을 준비하기로 했다.
> JH 교수님이 만들 챗봇의 응답을 출력하는 프로그램을 만들어보자.
접근
재귀를 사용해 문자열을 반복해 출력한다.
문제해결
> 재귀를 통해 i를 입력받는데 0부터 입력받아 입력받은 N까지 1씩 증가시키면서 만약 N과 i가 같으면 문제에 주어진 최종 문자열을 출력시킨다.(이게 최종탈출)
> 아니라면 정답일 때의 문자열이 아닌 재귀용 문자열을 출력하고 i를 증가시켜 재귀에 넣는다.
> 이제 i가 N과 같아져 최종에서 재귀가 깨져 다시 전 재귀로 돌아오면 마지막에 라고 답변하였지라는 문자열을 출력해줘야 하므로 이를 출력해준다.
그럼 재귀의 수만큼 이 문자열이 출력된다.
> main문에선 첫줄의 문자열을 출력하고 재귀함수에 0을 넣어 돌린다.
코드
#include <iostream>
#include <string>
using namespace std;
int N;
void Response(int r) {
string str(r * 4, '_');
cout << str << "\"재귀함수가 뭔가요?\"\n";
cout << str << "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n";
cout << str << "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n";
cout << str << "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n";
}
void Response2(int r) {
string str(r * 4, '_');
cout << str << "\"재귀함수가 뭔가요?\"\n";
cout << str << "\"재귀함수는 자기 자신을 호출하는 함수라네\"\n";
cout << str << "라고 답변하였지.\n";
}
void ChatBot(int i) {
if (i == N) {
Response2(i);
return;
}
Response(i);
ChatBot(i + 1);
cout << string(i * 4, '_') << "라고 답변하였지.\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N;
cout << "어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n";
ChatBot(0);
}

후기
문자열이 처리가 복잡해서 재귀도 헷갈렸다. 복잡했다.
특정 문자를 반복하는 방법으로 string(반복횟수, 반복할 문자)를 새로 알게됐다. 여기선 i마다 각각 4개씩 나오므로 반복횟수에 x4를 해줘야한다. 반복할 문자에 "____"로 줬더니 오류가 났다.