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

최창효·2022년 2월 4일
post-thumbnail



문제 설명

  • 예제와 같이 text를 출력하는 재귀함수를 만들어야 합니다.

접근법

  • 재귀는 종료 조건자기자신을 호출한다는 걸 항상 염두해야 합니다.
  • 해당 문제는 _를 통해 text가 몇번째 재귀함수인지를 잘 보여주고 있습니다.
  • 재귀함수에 depth를 인자로 주고, 재귀함수를 호출할 때마다 ++depth를 통해 몇 번 호출되었는지를 계산합니다.

정답

import java.util.Scanner;

public class Main{
	//코드가 실행되는 main부분입니다.
	public static void main(String[] args) {
		Scanner sc  = new Scanner(System.in); // 입력을 스캐너로 받습니다.
		int depth = 0;
		int N = sc.nextInt();
		System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
		recursive(depth,N);	
	}
    
    // _의 개수를 구하는 메서드입니다.
	static String underbar(int depth) {
		String underbar = "";
		for (int i = 0; i < depth*4; i++) {
			underbar +="_";				
		}		
		return underbar; 
	}

	static void recursive(int depth,int N) {
		if (depth == N) { //종료조건입니다. 
			String underbar = underbar(depth);
			System.out.println(underbar+"\"재귀함수가 뭔가요?\"");
			System.out.println(underbar+"\"재귀함수는 자기 자신을 호출하는 함수라네\"");
			System.out.println(underbar+"라고 답변하였지.");
			return;
		} else {
			String underbar = underbar(depth);
			System.out.println(underbar+"\"재귀함수가 뭔가요?\"");
			System.out.println(underbar+"\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.");
			System.out.println(underbar+"마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.");
			System.out.println(underbar+"그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"");
			recursive(++depth,N); // 여기서 재귀를 호출함으로써 재귀함수는 가장 안쪽부터 끝난다는 게 잘 보여집니다.
			System.out.println(underbar+"라고 답변하였지.");
		}
	}

}

기타

  • BufferedReader와 StringBuilder를 활용해 입출력 시간을 단축시킬 수 있습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main{
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int depth = 0;
		int N = Integer.parseInt(bf.readLine());
		StringBuilder sb = new StringBuilder();
		sb.append("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다."+"\n");
		sb.append(recursive(depth,N)); // StringBuilder에 recursive값을 append합니다.
		System.out.println(sb);
	}
	//여기도 반복문이 아니라 StringBuilder를 활용하면 메모리 효율을 높일 수 있습니다.
    //(sb.append("____"))
	static String underbar(int depth) {
		String underbar = "";
		for (int i = 0; i < depth*4; i++) {
			underbar +="_";				
		}		
		return underbar; 
	}
	
	
	static String recursive(int depth,int N) { //recursive는 String을 return 합니다
		if (depth == N) {
			String underbar = underbar(depth);
			String answer = (underbar+"\"재귀함수가 뭔가요?\""+"\n"+underbar+"\"재귀함수는 자기 자신을 호출하는 함수라네\""+"\n"+underbar+"라고 답변하였지.");
			return answer;
		} else {
			String underbar = underbar(depth);
			String answer = underbar+"\"재귀함수가 뭔가요?\""+"\n"
            +underbar+"\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어."+"\n"
            +underbar+"마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지."+"\n"
            +underbar+"그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\""+"\n"
            +recursive(++depth,N)+"\n"
            +underbar+"라고 답변하였지.";
			return answer; // answer에는 recursive를 반복한 전체 결과가 담깁니다.
		}
	}

}
profile
기록하고 정리하는 걸 좋아하는 백엔드 개발자입니다.

0개의 댓글