알고리즘/백준

[백준] 17478번 : 재귀함수가 뭔가요? - 자바(JAVA)

Junuuu 2022. 2. 20. 00:01
반응형

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

 

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

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

www.acmicpc.net

 

문제 해석

재귀 함수를 어떻게 활용할 수 있는지에 대한 문제입니다.

 

문제 풀이 전 설계

"를 출력하기 위해서는 \"를 사용해야 한다.

출력이 많으므로 StringBuilder에 쌓아서 한 번에 출력한다.

 

재귀 함수 호출하기 전에 실행해야 하는 구문들

"재귀 함수가 뭔가요?"

"잘 들어보게.~"

"마을 사람들은~"

"그의 답은~"

 

재귀 함수를 호출한 후에 실행해야 하는 구문들

"라고 답변하였지."

 

재귀 함수의 종료 조건에 실행해야 하는 구문들

"재귀 함수가 뭔가요?"

"재귀 함수는 자기 자신을 호출해야 하는~"

"라고 답변하였지"

 

이렇게 3가지로 나누어서 이해하시면 좋습니다.

 

코드 1

import java.util.Scanner;

public class Main {
	static int temp;
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = new Scanner(System.in).nextInt();
		temp = n;
		
		sb.append("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n");
		recursionMethod(n);
		System.out.println(sb.toString());
		
	}

	static void recursionMethod(int n) {
		if (n == 0) {
			for (int i = 0; i < temp - n; i++) {
				sb.append("____");
			}
			sb.append("\"재귀함수가 뭔가요?\"\n");
			for (int i = 0; i < temp - n; i++) {
				sb.append("____");
			}
			sb.append("\"재귀함수는 자기 자신을 호출하는 함수라네\"\n");
			for (int i = 0; i < temp - n; i++) {
				sb.append("____");
			}
			sb.append("라고 답변하였지.\n");
			return;
		}
		for (int i = 0; i < temp - n; i++) {
			sb.append("____");
		}
		sb.append("\"재귀함수가 뭔가요?\""+ "\n");
		for (int i = 0; i < temp - n; i++) {
			sb.append("____");
		}
		sb.append("\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n");
		for (int i = 0; i < temp - n; i++) {
			sb.append("____");
		}
		sb.append("마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n");
		for (int i = 0; i < temp - n; i++) {
			sb.append("____");
		}
		sb.append("그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"\n");
		recursionMethod(n - 1);
		for (int i = 0; i < temp - n; i++) {
			sb.append("____");
		}
		sb.append("라고 답변하였지.\n");

	}

}

 

코드 2

import java.util.Scanner;

public class Main {
	static String underBar = "";
	static String sArr[];

	public static void recursive(int num) {
		String temp = underBar;

		if (num == 0) {
			System.out.println(temp + sArr[0]); //재귀함수가 뭔가요?
			System.out.println(temp + sArr[4]); //재귀함수는 자기 자신을 호출하는 함수라네
			System.out.println(temp + sArr[5]); //라고 답변하였지
			return;
		}

		for (int i = 0; i < 4; i++) // 재귀호출하면서 반복되는 네개의 문장
			System.out.println(temp + sArr[i]);

		underBar += "____";         // 호출될 때 마다 밑줄이 4개씩 증가
		recursive(num - 1);

		System.out.println(temp + sArr[5]);
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		
		
		System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
		sArr = new String[6];
		sArr[0] = "\"재귀함수가 뭔가요?\"";
		sArr[1] = "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.";
		sArr[2] = "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.";
		sArr[3] = "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"";
		sArr[4] = "\"재귀함수는 자기 자신을 호출하는 함수라네\"";
		sArr[5] = "라고 답변하였지.";
		
		recursive(N);
		sc.close();
	}
}