본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 17478 재귀 함수가 뭔가요?

재귀함수에 대해서 간단하게 이해해보기 좋은 문제였다.

 

재귀함수 시작 전 메시지,

시작 후 반복되는 메시지,

재귀 끝날 타이밍 마주쳤을 때 메시지,

재귀 끝내고 돌아가며 반복해 남기는 메시지가 나뉘기 때문이었다.

 

사실 재귀 문제는 저 4타이밍에서 어떤 동작을 할 지 짜주면 되는 게 다인데, 가끔 어려운 문제에서 구조적인게 아리까리하면 그 내용도 헷갈리기 때문에 저런 시점을 정확하게 파악하는 것이 중요하다.

 


/  제출 1  /

import sys
input = sys.stdin.readline

n = int(input())

def recur(i,n):
  for k in range(i):
    print('____', end="")
  print("\"재귀함수가 뭔가요?\"\n")
  
  if i == n:
    for k in range(i):
      print('____', end="")
    print("\"재귀함수는 자기 자신을 호출하는 함수라네\"\n")

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

  for k in range(i):
    print('____', end="")
  print("라고 답변하였지.\n")
  
  
print("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n")
recur(0,n)

 

: 엥 처음 보는 에러였다.. 뭐지 하고 찾아보니, 이렇게 출력이 중요한 문제에서는 띄어쓰기, 공백 하나에서도 오류가 뜨기 때문에 그런 이유에서 난 오류였다. 타시 코드에디터에서 확인해보니 불필요한 줄바꿈 때문에 조금 다른 결과를 보인 것이었다. 

 

: 따라서 \n을 전부 빼줬다.

 

 

 

/  제출 2  /

import sys
input = sys.stdin.readline

n = int(input())

def recur(i,n):
  for k in range(i):
    print('____', end="")
  print("\"재귀함수가 뭔가요?\"")
  
  if i == n:
    for k in range(i):
      print('____', end="")
    print("\"재귀함수는 자기 자신을 호출하는 함수라네\"")

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

  for k in range(i):
    print('____', end="")
  print("라고 답변하였지.")
  
  
print("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.")
recur(0,n)

 

 

 

코드 보충 학습

 

해당 문제 같이 글이 많은 경우에는 숏코딩이 좋을 수 있다고 생각해서 찾아 봤다.

너무 극단적인 숏코딩은 좋아하지 않지만, 아래 정도의 코드는 내가 작성한 것보다 직관적으로 파악하기 더 좋은 것 같다.

 

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

 

파이썬은 문자열에 수 연산을 해서 문자열끼리 붙이는 것이 가능하다는  특징이 있고,

그것을 이용한 풀이법이다.

for문을 매번 돌리는 것보다 해당 문자열을 곱셈으로 늘려 사용하는 구현 방식이었다.