코딩 테스트/백준

[Python] 백준 25501 재귀의 귀재

위시리 2024. 9. 21. 01:43


문제 분석

  • 펠린드롬 : 대칭을 이루는 문자열 ex) AAA, ABBA, ABABA
  • 주어진 코드는 문자열이 펠린드롬인지 여부를 판단하는 함수가 구현된 코드
  • 코드에서 펠린드롬인지 판별하는 과정에서 재귀함수를 몇 번 호출하는가
  • 함수의 반환값과 재귀함수의 호출 횟수 구하기
  • 맞으면 1, 아니면 0 

 

코드 설계

  • t : test case  (1 ≤ t ≤ 1000)
  • s : 펠리느롬 문자열인지 확인할 문자  (1 ≤ |S| ≤ 1000)
  • 출력 : 각 test case 마다 반환값 & 함수를 호출한 횟수를 공백으로 구분하여 출력
def isPalindrome(s):
    return rescursion(s, 0, len(s)-1)
  • 문자열, 문자열 길이
def rescursion(s, l, r) :
    if l >= r :
        return 1
    elif s[l] != s[r] :
        return 0
    else :
        return rescursion(s, l+1, r-1)
  • 만약 l >= r 즉, 0보다 문자열의 길이-1 이 더 작은 경우 (예를 들면 아무것도 입력 x) return 1
  • s[l] != s[r] 즉 대칭이 아니면 return 0
  • ~ 종료조건

어떻게 호출 횟수를 계산할 수 있을까?

 

정답 코드

1차

import sys

t = int(sys.stdin.readline().rstrip())

def rescursion(s, l, r, cnt) :
    cnt += + 1
    if l >= r :
        return 1, cnt
    elif s[l] != s[r] :
        return 0, cnt
    else :
        return rescursion(s, l+1, r-1, cnt)

def isPalindrome(s):
    return rescursion(s, 0, len(s)-1, 0)


for _ in range(t) :
    cnt = 0
    s = sys.stdin.readline().rstrip()
    result, count = isPalindrome(s)
    print(result, count)

 

다른 풀이

import sys

input = sys.stdin.readline


def recursion(s, l, r):
    global cnt  # 함수 내에서 전역 변수로 cnt를 활용하기 위해 global로 명시해준다.
    cnt += 1

    if l >= r:
        return 1
    elif s[l] != s[r]:
        return 0
    else:
        return recursion(s, l + 1, r - 1)


def isPalindrome(s):
    return recursion(s, 0, len(s) - 1)


for _ in range(int(input())):
    cnt = 0
    print(isPalindrome(input().rstrip()), cnt)