백준 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 사이에 가장 큰 상호작용을 한다.