재귀함수에 대해서 간단하게 이해해보기 좋은 문제였다.
재귀함수 시작 전 메시지,
시작 후 반복되는 메시지,
재귀 끝날 타이밍 마주쳤을 때 메시지,
재귀 끝내고 돌아가며 반복해 남기는 메시지가 나뉘기 때문이었다.
사실 재귀 문제는 저 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문을 매번 돌리는 것보다 해당 문자열을 곱셈으로 늘려 사용하는 구현 방식이었다.
'CodingTest > Baekjun Online Judge' 카테고리의 다른 글
[ BOJ / 파이썬 ] 2448 별 찍기 * 다시 풀기 * (0) | 2022.08.25 |
---|---|
[ BOJ / 파이썬 ] 2447 별 찍기 (0) | 2022.08.25 |
[ BOJ / 파이썬 ] 1600 말이 되고픈 원숭이 (0) | 2022.08.21 |
[ BOJ / 파이썬 ] 2146 다리 만들기 (0) | 2022.08.20 |
[ BOJ / 파이썬 ] 2573 빙산 (0) | 2022.08.20 |