[BOJ/백준-Python]17478번 - 재귀함수가 뭔가요?

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

문제

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

매번 질문을 잘 받아주셨던 JH 교수님이지만 그는 중앙대학교가 자신과 맞는가에 대한 고민을 항상 해왔다.

중앙대학교와 자신의 길이 맞지 않다고 생각한 JH 교수님은 결국 중앙대학교를 떠나기로 결정하였다.

떠나기 전까지도 제자들을 생각하셨던 JH 교수님은 재귀함수가 무엇인지 물어보는 학생들을 위한 작은 선물로 자동 응답 챗봇을 준비하기로 했다.

JH 교수님이 만들 챗봇의 응답을 출력하는 프로그램을 만들어보자.

입력

교수님이 출력을 원하는 재귀 횟수 N(1 ≤ N ≤ 50)이 주어진다.

출력

출력 예시를 보고 재귀 횟수에 따른 챗봇의 응답을 출력한다.

예제 입력 1

2

예제 출력 1

어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
____"재귀함수가 뭔가요?"
____"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
____마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
____그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
________"재귀함수가 뭔가요?"
________"재귀함수는 자기 자신을 호출하는 함수라네"
________라고 답변하였지.
____라고 답변하였지.
라고 답변하였지.

예제 입력 2

4

예제 출력 2

어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
"재귀함수가 뭔가요?"
"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
____"재귀함수가 뭔가요?"
____"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
____마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
____그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
________"재귀함수가 뭔가요?"
________"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
________마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
________그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
____________"재귀함수가 뭔가요?"
____________"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
____________마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
____________그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."
________________"재귀함수가 뭔가요?"
________________"재귀함수는 자기 자신을 호출하는 함수라네"
________________라고 답변하였지.
____________라고 답변하였지.
________라고 답변하였지.
____라고 답변하였지.
라고 답변하였지.

해결할 방법을 생각해보자.💡

재귀함수가 어디에 놓여야하는지 잘 생각해봐야하는 문제다.

처음으로 N을 입력받아주자.

N = int(input())

이제 출력예제를 보면서 어떤 부분이 반복되는지를 확인하며 재귀함수가 들어갈 부분을 생각해보자.

우선, 첫줄은 첫 내용만 나오고 반복되지 않는 것으로 보아 함수안에는 들어갈 필요가 없어보인다.

그리고 파란색으로 색칠한 부분이 계속 반복되는데, 어떠한 특정한 조건에 걸리지 않을 때 반복되는 것으로 파악된다.

또한, 재귀 단계가 깊어질수록 언더바(_)가 4개씩 늘어나는 것을 볼 수있으며, 어느 특정 순간에 걸렸을 때는 초록색으로 표시한 부분처럼 나오는 것을 확인할 수 있다.

예제 입력1을 보아하니, N이 2일 때는 제일 많은 언더바가 4개 * 2 인 것을 확인할 수 있다. 따라서 N값인 2에 조건이 걸렸을 때 저 문구가 나오게 하면 되는 것 같다.

image

그러면 이제 함수를 정의해보자. JH 교수가 준비한 챗봇이므로 JH라는 이름으로 함수를 정의하겠다.

함수가 재귀될 때 언더바(_)가 나오는 것을 고려해서 두 번째 파라미터에 count = 0으로 디폴트를 잡아놓았다.

def JH(x, count = 0):

재귀가 시작될 때 언더바가 4개씩 늘어난다. 따라서, 반복되서 쓰일거 같으므로 따로 정의해두자.

처음에는 디폴트 0으로 잡힌 상태로 되므로 언더바가 나오지 않는다.

	recur_bar = "_" * (4 * count) 

"재귀함수가 뭔가요?"라는 구문은 계속 나오므로 우선 적어준다.

	print(recur_bar + '"재귀함수가 뭔가요?"')

이제 여기가 중요하다. 파라미터 x가 0이되는 순간에 아까 초록부분이 나오게 만들어주고 함수를 탈출하게 구성을 해줘야한다. 그래야 재귀가 끝나기 때문이다.

	if x == 0:
        print(recur_bar + '"재귀함수는 자기 자신을 호출하는 함수라네"')
        print(recur_bar + '라고 답변하였지.')
        return

이제 N값이 0이 아닐 경우에는 파란부분이 반복되도록 만들어줘야 한다.

	print(recur_bar + '"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
    print(recur_bar + '마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
    print(recur_bar + '그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')

여기도 중요한데, 재귀함수가 들어가야하는 부분이다. 예제 출력을 보면 ~라고 답변하였지.라는 연속해서 나타나기 때문이다. 그리고 이 부분에서 언더바가 4개씩 늘어나게 count에 1을 더해주자.(count가 디폴트이므로, 1늘어난 count를 반영하기 위해서는 파라미터에 넣어줘야한다.)

	count += 1
    JH(x-1, count)
    print(recur_bar + '라고 답변하였지.')	

이제 만들어준 함수를 사용해보자. 아까 빨간 부분을 먼저 출력해주고, JH 함수 안에 N을 파라미터로 넣어서 실행해보자.

print("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.")
JH(N)

코드💻

N = int(input())

def JH(x, count = 0):
    recur_bar = "_" * (4 * count)
    print(recur_bar + '"재귀함수가 뭔가요?"')
    
    if x == 0:
        print(recur_bar + '"재귀함수는 자기 자신을 호출하는 함수라네"')
        print(recur_bar + '라고 답변하였지.')
        return

    print(recur_bar + '"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
    print(recur_bar + '마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
    print(recur_bar + '그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')
    count += 1
    JH(x-1, count)
    print(recur_bar + '라고 답변하였지.')

print("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.")
JH(N)

해결 로그

문제 푼 날짜 체크
2022-06-17
   
   
   
   

2022

[web]jQuery 복습 3

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 2

13 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 1

14 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리4

5 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리3

10 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리2

7 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리1

8 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]CSS 기초 정리

11 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]HTML 기초 정리

8 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[Pandas]pandas 연습

3 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑

2021

[Python기초]module

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑