Algorithm/백준

[백준 Python] 17478번 재귀함수가 뭔가요? 문제풀이(3가지 방법)

얼음새꽃 2023. 7. 11. 15:54
반응형

문제

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. 종료한다.

 

 

 

(번외)

세 코드 모두 실행시간, 메모리가 동일하다. 함수호출 비용 등 이런 세세한거까지 생각한다면 차이가 어느정도 있겠다만.

일단은! 본인이 더 이해하기 쉽고 편한 코드로 작성하면 될듯하다.

반응형