백준 17478번 재귀함수 알고리즘

박건도·2023년 3월 26일
0

알고리즘

목록 보기
3/3
post-thumbnail

백준 문제 링크 : https://www.acmicpc.net/problem/17478

재귀함수는 자기 자신을 호출하는 함수이다.
코드는 https://yongku.tistory.com/entry/%EB%B0%B1%EC%A4%80-17478%EB%B2%88-%EC%9E%AC%EA%B7%80%ED%95%A8%EC%88%98%EA%B0%80-%EB%AD%94%EA%B0%80%EC%9A%94-%EC%9E%90%EB%B0%94Java
이 분의 블로그 코드를 참고했다.

import java.util.Scanner;

public class Main {
	static String underbar ="";
	public static void recur(int N) {
		String line = underbar; // line == "" -------(2)
		if(N==0) ------(3)
		{
			System.out.println(line+"\"재귀함수가 뭔가요?\"");
			System.out.println(line+"\"재귀함수는 자기 자신을 호출하는 함수라네\"");
			System.out.println(line+"라고 답변하였지.");
			
			return; //종료조건 -----(9)
		}
        
		System.out.println(line+"\"재귀함수가 뭔가요?\"");  //-----(4)(7)
		System.out.println(line+"\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.");
		System.out.println(line+"마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.");
		System.out.println(line+"그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"");
		
		underbar += "____";  //____를 더해간다.  -------(5)
		recur(N-1);  //-------(6)(8)
		
		System.out.println(line+"라고 답변하였지.");
		return ; -----(10)
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
		recur(N); //----(1)
	}
}
  1. Main함수에서 N을 입력 받으면 입력받은 N을 recur함수로 넘겨준다.

  2. 처음 line은 "" 공백이다.

  3. N이 0일때만 if문으로 간다. 0이 아닐경우 if문 밑의 문장들을 처리한다.

  4. 처음 이 문단을 실핼 할 때는 line이 공백이므로 ____ 없이 문장들을 출력한다.

  5. underbar에 __ 을 더한다. 그러면 line이 __가 된다.

  6. recur(N-1)을 실핼하여 다시 3번으로 간다. 똑같이 N이 0이 아닐경우 지나치고 0이면 실행한다.

  7. 이번에는 underbar에 __가 저장되어 있으므로 문장들 앞에 __ 를 붙여서 문장 출력을 한다.

  8. 만약 N이 0이 되었다면 if문으로 가게 된다. 그러면 if문에서는 7번에서 입력한 언더바보다 4개를 더 더해서 if문 안의 문장 앞에 붙이게 된다.

  9. if문 문장끝에 return이 있으므로 재귀함수의 종료를 의미한다. 그러면 한단계전인 7번으로 돌아가서 if문의 언더바개수보다 4개 적은 단계가 된다.

  10. 9번단계가 끝난뒤에 다시 return까지 도달하게 되면 또 다시 전단계로 돌아가는 동작을 반복하여 언더바가 4개씩 줄어드는 동작을 실시한다. 결과적으로 언더바는 4번 단계처럼 공백이 된다.

재귀함수에서 return; 즉 void는 종료를 의미하며 그 전 단계로 돌아간다.

profile
풀스택 개발자

0개의 댓글