재귀용법을 익히기 위해 선택한 쉬운(?) 문제였다. 알고리즘 문제를 풀 때 내가 메소드(함수)를 직접 만들고 해당 메소드를 호출해서 만드는 게 처음이라 애를 먹었다. 특히 main() 메소드가 아니더라도 만들어준 static void 메소드에서 System.out.println("");이 가능하다는 게 약간 충격이었다. void는 리턴값이 없는 것뿐, Syso와 같은 동작이 당연히 작동하는 메소드이다. 메소드는 그 괄호 안의 동작을 실행시켜주는 함수니까!!
근데 좀 헷갈리는 것은 static 메소드와 변수를 왜 써주냐는 것이다.
static이 아니면 자꾸 에러가 뜨던데 왜 그러나 싶다.
고정되어 있어야만 다른 데에서도 자유롭게 쓸 수 있기 때문일까??
이번 풀이에선 재귀함수를 두 번이나 썼는데 한 번만 쓰고도 해낼 수 있도록 더 개선해보고 싶다.
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
rec(n);
end(n);
}
// 위에 선언해줘야
public static String underbar = "";
// 재귀함수
public static void rec(int n) {
// 재귀함수 종료
// 종료를 재귀함수 부른 후에 넣어주면 계속 재귀함수를 호출
// 위에 종료 조건을 주는 게 안전
if (n == 0) {
System.out.println(underbar + "\"재귀함수가 뭔가요?\"");
System.out.println(underbar + "\"재귀함수는 자기 자신을 호출하는 함수라네\"");
System.out.println(underbar + "라고 답변하였지.");
return;
}
System.out.println(underbar + "\"재귀함수가 뭔가요?\"");
System.out.println(underbar + "\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.");
System.out.println(underbar + "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.");
System.out.println(underbar + "그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"");
underbar += "____";
rec(n-1);
}
// 4가 들어오면 ____를 3번, 2, 1, 0번 한 것까지 라고 답변해야 함
public static void end(int n) {
StringBuilder stb = new StringBuilder();
if (n == 1) {
System.out.println("라고 답변하였지.");
return;
}
for (int i = 0; i < n-1; i++) {
stb.append("____");
}
stb.append("라고 답변하였지.");
System.out.println(stb);
end(n-1);
}
}
저는 rec() 메소드 안에서 end()메소드를 호출했는데, main에서 end() 재귀를 이용할 수 있는 방법도 있겠네요! 다른 풀이 방법 알아갑니다!