[백준 BOJ] 17478번 재귀함수가 뭔가요? (Java)

2022. 9. 28. 14:59PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/17478

 

17478번: 재귀함수가 뭔가요?

평소에 질문을 잘 받아주기로 유명한 중앙대학교의 JH 교수님은 학생들로부터 재귀함수가 무엇인지에 대하여 많은 질문을 받아왔다. 매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대

www.acmicpc.net

백준 BOJ 17478번 재귀함수가 뭔가요? 문제 사진1
백준 BOJ 17478번 재귀함수가 뭔가요? 문제 사진2
백준 BOJ 17478번 재귀함수가 뭔가요? 문제 사진3

 

접근 방법 - 재귀 함수를 이용한 출력 문제

백준의 17478번 문제는 재귀 함수를 이용하여 출력을 제어해야 하는 문제이다.

해당 문제는, 입력받은 숫자에 대하여 규칙적인 출력을 하게 해서 해결해야 하는 문제이다.

필자와 같은 경우에는, 각각 다른 출력문으로 구성된 함수 3개를 제어하며 출력을 수행하도록 하였다.

여기서 함수를 불러올 때 재귀를 하거나 다른 함수를 호출하여 넘어가는 식으로 제어하면서 해결해보았다.

자세한 내용은 아래의 설명과 코드를 참고해보길 바란다. 사실 스스로도 코드로 무슨 짓을 했는지 모르겠다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 값(n)을 입력받는다.

 

2) "어느 한 컴퓨터공학과 ~ 찾아가 물었다." 구문을 출력한다.

이 부분은 어떤 케이스에서든 첫 번째 문장에서 딱 한번 출력되기 때문에 함수를 이용하지 않고 바로 출력하도록 하였다.

 

3) 아래 3개의 함수를 이용하여 출력을 수행한다.

1) re1(num) :: <재귀함수가 뭔가요? ~ 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.>까지 출력
2) re2(num) :: <재귀함수가 뭔가요? ~ 재귀함수는 자기 자신을 호출하는 함수라네>까지 출력
3) re3(num) :: <라고 답변하였지.> 출력

num 매개변수는 각 출력의 경우에서 "____" 부분을 몇 번 출력해야 하는지 제어하기 위해 필요하다.
여기서, re1와 re3 부분은 num의 크기에 따라 출력하는 횟수에 변동이 있지만, re2 부분은 어떤 케이스에서든 딱 한 번만 출력된다.
따라서, re1 -> re2 -> re3 순으로 출력을 수행하되, re1에서는 num을 점차 증가시키고 re3에서는 num을 점차 감소시키며 재귀를 해야 한다.
re2의 경우에는 매개변수로 받은 num 값을 참고하며 딱 한 번만 수행하도록 한다.
(자세한 사항은 코드를 참고해보길 바란다.)

 

4) 모든 출력을 수행하였다면, 실행 종료한다.

반응형

 

성공한 코드

import java.util.Scanner;

//백준 17478번 코드
public class Main {
	public static int num=0;
	public static int n;
	
	public static void re1(int num) {
		for(int i=0;i<num;i++) {
			System.out.print("____");
		}
		System.out.println("\"재귀함수가 뭔가요?\"");
		for(int i=0;i<num;i++) {
			System.out.print("____");
		}
		System.out.println("\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.");
		for(int i=0;i<num;i++) {
			System.out.print("____");
		}
		System.out.println("마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.");
		for(int i=0;i<num;i++) {
			System.out.print("____");
		}
		System.out.println("그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"");
		
		num++;
		if(num<n) {
			re1(num);
		}
		else {
			re2(num);
		}
	
	}
	
	public static void re2(int num) {
		for(int i=0;i<num;i++) {
			System.out.print("____");
		}
		System.out.println("\"재귀함수가 뭔가요?\"");
		for(int i=0;i<num;i++) {
			System.out.print("____");
		}
		System.out.println("\"재귀함수는 자기 자신을 호출하는 함수라네\"");
		re3(num);
	}
	
	public static void re3(int num) {
		for(int i=0;i<num;i++) {
			System.out.print("____");
		}
		System.out.println("라고 답변하였지.");
		num--;
		if(num<0) {
			System.exit(0);
		}
		re3(num);
	}
	
	public static void main(String args[]) {
		Scanner s=new Scanner(System.in);
		n=s.nextInt();
		
		System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
		re1(num);
	}
}

 

제출 결과

백준 BOJ 17478번 재귀함수가 뭔가요? 문제 Java 제출 결과

(2022.07.12 백준 17478번 문제 제출 결과)

반응형