코딩 테스트 연습/백준

[Python]Baekjoon 17478번: 재귀함수가 뭔가요?

jaeheon0520 2024. 3. 4. 19:21

1. 문제

 

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

 

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

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

www.acmicpc.net

 

출력예시에 맞게 챗봇의 응답을 출력하는 문제이다.

 

문제 이름에서도 알 수 있듯이 재귀함수를 활용해야 한다.

 

입력과 출력의 예시는 다음과 같다.

 

예시1

 

예시 2

 

2. 풀이

입력받은 숫자 T는 재귀함수를 몇 번 호출하는지를 나타내는 숫자이다.

 

최초로 함수가 한번 호출되고, 재귀로 T번 호출되기 때문에 함수는 총 T+1번 실행이 되는데 이 부분을 생각하는 게 포인트였다.

 

우선 주어진 예시에서 각 문장이 어떻게 등장하고 있는지 살펴보자.

 

어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다. 라는 문장이 최초 1번만 등장한다.

 

즉 재귀호출이 필요 없으므로 시작하자마자 출력해주면 된다.

 

그다음 "재귀함수가 뭔가요?"라는 질문이 T+1번 등장하고 있다.

 

그에 대한 답변으로 스토리텔링하는 부분이 T번 등장한다.

 

"재귀함수가 뭔가요?"라는 질문과 스토리텔링이 번걸아가며 나오다가

 

마지막 질문에서 "재귀함수는 자기 자신을 호출하는 함수라네"라는 답변이 등장한다.(T+1번째 질문에 대한 답변)

 

즉 재귀함수 내에서 조건문을 잘 작성해서 T+1번째에는 다른 답변이 나오게 코드를 짜주면 된다.

 

그리고 '___라고 답변하였지' 라는 형태로 마무리되는데, 이 문장은 다른 문장과 번갈아가며 나오는 게 아니라 마지막에 몰아서 한 번에 출력되고 있다.

 

재귀함수의 호출이 끝난 뒤에 '라고 답변하였지' 라는 문장을 출력하면 마지막에 몰아서 한번에 출력되게 할 수 있다.

 

_의 개수 조정은 몇 번째 호출인지를 매개변수로 전달해서 _가 출력되는 개수를 조정할 수 있다.

 

3. 코드

import sys
input = sys.stdin.readline

T = int(input())

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

recursion(0)

 

4. 느낀점

DFS 알고리즘을 더 잘 이해하기 위해 재귀함수를 공부할 필요를 느꼈다.

 

이번 문제는 재귀함수의 이모저모를 살펴볼 수 있는 좋은 문제였다.

 

다음엔 DFS 알고리즘을 활용하여 문제를 풀어보자.

 

오늘 하루도 쌓였다.