주어진 문자열이 팰린드롬인지 구별하는 문제이다.
팰린드롬이란 문자열을 앞에서부터 읽어도 뒤에서부터 읽어도 똑같은 문자열을 의미한다.
재밌는 부분은 문제의 제목인 재귀의 귀재 또한 팰린드롬이라는 것이다.
import sys
input=sys.stdin.readline
def recursion(s, l, r, a):
a[0] = a[0] + 1
if l >= r:
return 1
elif s[l] != s[r]:
return 0
else:
return recursion(s, l + 1, r - 1, a)
N = int(input())
arr = []
for i in range(N):
s = input().rstrip()
a = [0]
print(recursion(s, 0, len(s) - 1, a), a[0])
팰린드롬을 식별하기 위한 기본 return값을 제외하고 몇번 호출되었는지 식별 가능한 코드를 구현해야한다.
call by reference타입의 변수를 두어 호출시마다 1 증가하도록하여 main문에서 식별 가능하도록 하였다.
python은 call by assignment이다.
python의 경우는 위의 경우처럼 주소 값 참조나, 값 복사와 조금 다르다.
이유는 python은 모든 것을 "객체"로 판단한다는 데에 있다.
즉, int 변수나 list객체 li = [0]을 그대로 받더라도 함수내 li는 이미 지역변수로 처리되어 함수 내에서 li에 [1]를 binding하더라도 함수 호출이 끝나면 전역 li는 값이 바뀌지 않는다.
하지만, 함수 내 지역변수 li의 인덱스로 객체 내 요소를 직접 조작하게 되면 객체 자체가 변한다.
ex) li[0] = 1
input=sys.stdin.readline로 input값을 받게되면 개행 문자가 포함되어 값을 받게된다.
strip() 함수는 문자열 내에 공백을 제거해주며 rrstrip은 오른쪽의 공백을 제거해준다.
이 함수를 사용하지 않고 readline으로 값을 받으면 s의 길이가 1씩 더해져서 출력되니 주의해야한다.