백준 17478 재귀함수가 뭔가요

Solution 1. 재귀

package practice.algorithm.recursion;

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

/**
 * https://www.acmicpc.net/problem/17478
 * 15500 kb / 168 ms
 * 재귀함수가 뭔가요?
 * - 출력 답안을 보면 답변을 감싸고 있는 함수가 반복 호출되는 모양새이다. 출력 문구 내부에 재귀함수로 호출해주어 순환 호출하도록 구성하였다. 
 * - 또한 출력시 indent 가 적용되어있는 것을 볼 수 있는데, 각 depth 마다 4개씩 늘어나는 규칙을 발견하여 이 역시 재귀함수로 호출하여 연산할 수 있도록 하였다. (반복문 보다 코드가 깔끔할 것으로 생각했다.) 
 * */
public class Bj17478 {

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

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        print(n);
    }

    private static void print(int n) {
        System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
        answer(n, 0);
    }

    private static void answer(int n, int indent) {
        if (n == 0) {
            System.out.println(getIndent(indent) + QUESTION);
            System.out.println(getIndent(indent) + "\"재귀함수는 자기 자신을 호출하는 함수라네\"");
            System.out.println(getIndent(indent) + ANSWER);
            return;
        }

        System.out.println(getIndent(indent) + QUESTION);
        System.out.println(getIndent(indent) + EXPLANATION_1);
        System.out.println(getIndent(indent) + EXPLANATION_2);
        System.out.println(getIndent(indent) + EXPLANATION_3);

        answer(n-1, indent + 1);

        System.out.println(getIndent(indent) + ANSWER);
    }

    private static String getIndent(int index) {
        if (index == 0) {
            return "";
        }

        return "____" + getIndent(index-1);
    }
}

Last updated