문제
https://www.acmicpc.net/problem/17478
코드
첫번째 시도
재귀를 두 개 사용해서 표현. 처음, 중간, 마지막 으로 분리해서 각각 출력이 되게끔했다.
가장 쉽게 풀이할 수 있는 방법이 아닐까.
다만 재귀하나로 될거같은데, 뭔가 너무 많고 지저분해서 재시도
# 첫번째 시도
# 탭을 출력하는 함수
def print_tab(repeat_count):
if repeat_count <= 0:
return True
elif repeat_count == 1:
print("____", end='')
else:
for i in range(repeat_count):
print("____", end='')
# 메세지 내용을 출력하는 함수
def message(n):
if n != 0:
message(n - 1)
print_tab(n-1)
print('"재귀함수가 뭔가요?"')
print_tab(n-1)
print('"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
print_tab(n-1)
print('마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
print_tab(n-1)
print('그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')
# 마지막 메시지를 출력하는 함수
def last_message(n):
if n != 0:
print_tab(n-1)
print('라고 답변하였지.')
last_message(n-1)
if __name__ == '__main__':
n = int(input())
print("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.")
message(n)
print_tab(n)
print('"재귀함수가 뭔가요?"')
print_tab(n)
print('"재귀함수는 자기 자신을 호출하는 함수라네"')
last_message(n+1)
뭔가 알고리즘은 간결, 깔끔한게 많다보니 그렇게 줄여서 재시도한 코드
탭을 사용하는 것을 함수를 호출하지 않고 사용했다.
나는 줄어드는 것을 구현했는데, 늘어나면서 구현하는 것을 시도했다.
백준 1등 채점을 참조했다.
# 두번째 시도
def message(n, repeat_count):
print('____' * n + '"재귀함수가 뭔가요?"')
if n != repeat_count:
print('____' * n + '"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
print('____' * n + '마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
print('____' * n + '그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')
message(n + 1, repeat_count)
else:
print('_' * n + '"재귀함수는 자기 자신을 호출하는 함수라네"')
print('_' * n + '라고 답변하였지.')
if __name__ == '__main__':
n = int(input())
print("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.")
message(0, n)
세번째 시도
왜 재귀를 써야하지? 반복문으로도 할 수 있지 않을까?
해서 만들게 된 반복문 코드. 개인적으로는 재귀보다 이게 더 마음에 든다.
#세번째 시도
if __name__ == '__main__':
n = int(input())
print("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.")
index = 0
while index != n:
print('____' * index + '"재귀함수가 뭔가요?"')
print('____' * index + '"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.')
print('____' * index + '마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.')
print('____' * index + '그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."')
index += 1
print('____' * index + '"재귀함수가 뭔가요?"')
print('____' * index + '"재귀함수는 자기 자신을 호출하는 함수라네"')
while index >= 0:
print('____' * index + '라고 답변하였지.')
index -= 1
문제풀이
KeyPoint
1. 공통된 규칙을 찾는다. 이번 문제의 경우, 같은 문자열이 계속 반복된다. 그리고 반복을 거듭할수록 ____ (언더바 4개)가 한묶음씩 추가된다.
2. 처음과 마지막에는 다른 문자열을 1회 말한다.
반복이 될때마다 탭을 한개씩 늘린다. 가 키포인트다.
1. 일단 "재귀함수가 뭔가요?"를 반복하는 함수든 반복문이든 만든다.
2. 반복할수록 특정 값(index)이 1씩 증가하도록 한다.
3. 1씩 증가하는 값(index)에 ____ 를 곱해서 언더바 묶음이 점차 늘어날 수 있도록 한다.
4. 마지막 반복횟수와 특정값(index)이 동일하다면 마지막에 다른 문자열을 출력한다.
5. 종료한다.
(번외)
세 코드 모두 실행시간, 메모리가 동일하다. 함수호출 비용 등 이런 세세한거까지 생각한다면 차이가 어느정도 있겠다만.
일단은! 본인이 더 이해하기 쉽고 편한 코드로 작성하면 될듯하다.
'Algorithm > 백준' 카테고리의 다른 글
[백준 Python] 1259번 팰린드롬수 문제 풀이 (0) | 2023.07.12 |
---|---|
[백준 Python] 25501번 재귀의 귀재 문제풀이 (0) | 2023.07.11 |
[백준 Python] 10807번 개수 세기 문제 풀이 (0) | 2023.04.06 |
[백준 Python] 3003번 킹, 퀸, 룩, 비숍, 나이트, 폰 문제풀이 (0) | 2023.04.06 |
[백준 Python] 2562번 최댓값 문제풀이 (0) | 2023.04.06 |