Hope Everyone Is Happy

[실버5] 17478. 재귀함수가 뭔가요? (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버5] 17478. 재귀함수가 뭔가요? (Java)

J 크 2023. 8. 15. 14:19
728x90
반응형

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

 

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

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

www.acmicpc.net

재귀 함수는 뭘까요 ??


※  문제를 요약하면 아래와 같습니다.

 친절한 교수님이 재귀함수를 이해시켜주기 위해 챗봇을 만듬 

"어느 한 컴퓨터 공학과 학생이 유명한 교수님을 찾아가 물었다. "로 챗봇의 대화가 시작 (아래 출력 예제 참조)

 "재귀함수가 뭔가요?" ~ "잘들어보게~ 라고물었어", 라고 답변하였지를 입력된 수 +1 만큼 반복

마지막 "재귀 함수가 뭔가요?" 에는 "재귀함수는 자기 자신을 호출하는 함수라네" 출력

 입력은 교수님이 원하는 재귀 횟수 (1 <= N <= 50)

출력은 예시 참조


◈ Input - 1

2

◈ Output - 1

어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
____"재귀함수가 뭔가요?"
____"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
____마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
____그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
________"재귀함수가 뭔가요?"
________"재귀함수는 자기 자신을 호출하는 함수라네"
________라고 답변하였지.
____라고 답변하였지.
라고 답변하였지.

◈ Input - 2

어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
____"재귀함수가 뭔가요?"
____"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
____마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
____그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
________"재귀함수가 뭔가요?"
________"재귀함수는 자기 자신을 호출하는 함수라네"
________라고 답변하였지.
____라고 답변하였지.
라고 답변하였지.

◈ Output - 2

어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
____"재귀함수가 뭔가요?"
____"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
____마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
____그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
________"재귀함수가 뭔가요?"
________"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
________마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
________그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
____________"재귀함수가 뭔가요?"
____________"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
____________마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
____________그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
________________"재귀함수가 뭔가요?"
________________"재귀함수는 자기 자신을 호출하는 함수라네"
________________라고 답변하였지.
____________라고 답변하였지.
________라고 답변하였지.
____라고 답변하였지.
라고 답변하였지.

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

 반복되는 문장과 반복되는 문장 앞 라인 출력을 위한 매개변수 2개로 재귀 함수 설계

     ( 필자 본인은 조금 더 가독성을 높이기 위해 2개로 했습니다. 하나로 써도 충분합니다! )

재귀 함수 호출 시 Stack 자료 구조와 동일하게 메모리가 쌓이는 특징을 활용 ( Last In First Out )

  ex) 입력 값 : 4  == >  whatIsTheRecursiveFunction(4,0) = 재귀 함수

     ( 가장 나중에 쌓인 메모리가 가장 먼저 출력 )

    : 함수 안, 재귀 함수 호출 전에 출력할 것 ( 출력 후 재귀함수가 Stack에 쌓임 )

"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."

    : 함수 안, 재귀 함수 호출 후에 출력할 것 ( 재귀함수가 Stack에 쌓인 후 나중에 출력 )

________________라고 답변하였지.

    : 마지막 재귀 함수 호출일 경우 출력 할 것

"재귀함수는 자기 자신을 호출하는 함수라네"
 

  

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    static BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void whatIsTheRecursiveFunction(int nCount, int nPrintline) throws IOException {
        
    	String strTemp = "";
    	
    	String strLine = "";
    	
        for(int i = 0; i < nPrintline; i++)
        	strLine += "____";
        
        strTemp += strLine + "\"재귀함수가 뭔가요?\"\n";
        if(nCount <= 0) {
    		strTemp += strLine + "\"재귀함수는 자기 자신을 호출하는 함수라네\"\n";
    		bWriter.write(strTemp);
    	} else {
        
			strTemp += strLine + "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n"
					+ strLine + "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n"
					+ strLine + "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n";
			bWriter.write(strTemp);
			bWriter.flush();
			
			// Stack 구조로 쌓임
			whatIsTheRecursiveFunction(nCount-1, nPrintline+1);
    	}
        
        
        String strT = "";
        for(int i = 0; i < nPrintline; i++)
            strT += "____";

        strT += "라고 답변하였지.\n";
        bWriter.write(strT);
        bWriter.flush();
    }

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));

        int nCount = Integer.parseInt(bReader.readLine());
        bWriter.write("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n");

        whatIsTheRecursiveFunction(nCount, 0);

        bWriter.close();
    }
}

문제가 재밌어 보여서 골랐는데 막상 풀 때는 귀찮은게 많았네요. 재귀함수의 정의를 아주 잘 기억할 수 있게 해준 문제였습니다.

읽어주셔서 감사합니다!

광복절 기념

Good Luck! (피드백 고맙습니다)