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

letsbebrave·2021년 12월 15일
0

codingtest

목록 보기
11/146

문제

느낀점

재귀용법을 익히기 위해 선택한 쉬운(?) 문제였다. 알고리즘 문제를 풀 때 내가 메소드(함수)를 직접 만들고 해당 메소드를 호출해서 만드는 게 처음이라 애를 먹었다. 특히 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);
	}

}
profile
그게, 할 수 있다고 믿어야 해

1개의 댓글

comment-user-thumbnail
2021년 12월 19일

저는 rec() 메소드 안에서 end()메소드를 호출했는데, main에서 end() 재귀를 이용할 수 있는 방법도 있겠네요! 다른 풀이 방법 알아갑니다!

답글 달기