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

thang_velog·2022년 7월 12일
0

백준

목록 보기
1/1

백준 17478번
재귀함수를 더 공부하기 위해 고르게 된 문제다.
문제만 보고 굉장히 쉽다고 생각했지만 굉장히 쉬운 정도는 아니였다.

출력 부분을 보다보니 문제를 이해하는데 어렵다고 생각했다.
이 문제의 핵심은 재귀함수의 반복을 통해서 "____" 이 부분의 증감 부분이다.

import java.util.Scanner;

public class Main {

    static String marker = "";

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

    static void recursion(int n) {

        String i = marker;

        if (n == 0) {
            System.out.println(i + "\"재귀함수가 뭔가요?\"");
            System.out.println(i + "\"재귀함수는 자기 자신을 호출하는 함수라네\"");
            System.out.println(i + "라고 답변하였지.");

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

            marker += "____";
            recursion(n - 1);
//            marker = marker.replaceFirst("____", "");
            System.out.println(i + "라고 답변하였지.");
        }

    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        print();
        recursion(n);

    }

}

출력의 가장 첫줄은 한번만 출력되고 반복되지 않는다.
recursion 메소드에 입력값을 받고 그 값만큼 재귀함수가 실행된다.
"__" 부분은 처음에 static 변수로 선언하여 재귀함수가 실행될 때마다 추가될 수 있도록 만들어줬다. 그러나 마지막 출력에서 "__"가 줄어두는 부분을 구현하는 방법을 찾는게 어려웠다.

marker = marker.replaceFirst("____", "");

이 방법을 통해 줄여주는 방법을 찾았다.

또 하나 찾은 방법이 있는데 그게 본 코드에 작성된 방법이다.
marker 변수를 또 다른 스트링 변수에 담아두고 증가된 marker 변수 대신에
저장해둔 i를 출력하는 방법인데 이 방법이 가장 좋았다.

recursion(n - 1);

이렇게 n값을 줄여가면서 n == 0 인 순간에 재귀함수를 리턴하여 이전의 재귀함수로 돌아가고 그 다음 부분을 실행하면서 "라고 답변하였지" 라는 부분을 잘 출력할 수 있게 되는데 이 부분이 재귀함수와 return 사이에 가장 큰 상호작용을 한다.

0개의 댓글