데이터 분석
is_palindrome 코드 분석
temporubato108
2024. 8. 26. 11:18
import string
def is_palindrome(text):
text = ''.join(text.lower().split())
for char in string.punctuation:
text = text.replace(char, "")
if text == "":
return True
if text[0] != text[-1]:
return False
return is_palindrome(text[1:-1])
어째서 .split()으로 나눈 후 굳이 ''.join()으로 다시 더하는가?
- text.lower():
- 텍스트를 모두 소문자로 변환합니다. 회문을 검사할 때 대소문자 구분을 없애기 위해서입니다.
- text.split():
- 기본적으로 공백을 기준으로 텍스트를 나눕니다. 이 과정에서 여러 단어로 이루어진 텍스트를 단어별로 분리해 리스트로 만듭니다. 예를 들어, "A man a plan a canal Panama" 같은 문장이 "['a', 'man', 'a', 'plan', 'a', 'canal', 'panama']"로 분리됩니다.
- 이 과정에서 텍스트에 포함된 모든 공백(스페이스, 탭, 줄바꿈 등)이 제거됩니다.
- ''.join(...):
- split()으로 분리된 단어들을 다시 하나의 문자열로 합칩니다. 이때 '' (빈 문자열)을 사용해 합치므로, 원래 텍스트의 공백들이 사라진 상태로 연결됩니다.
- 위 예시의 경우 'amanaplanacanalpanama'가 됩니다.
회문을 판단할 때, 공백이나 대소문자 같은 요소는 의미가 없기 때문에 이를 제거하여 순수한 알파벳만 남긴 후 비교하기 위함입니다. 결과적으로, "A man a plan a canal Panama"를 "amanaplanacanalpanama"로 변환해서 회문 검사를 할 수 있게 됩니다.
함수의 마지막줄 return is_palindrome(text[1:-1])의 역할
재귀 호출 (return is_palindrome(text[1:-1])):
- 첫 번째와 마지막 문자가 같다면, 이 두 문자를 제거한 후 나머지 문자열이 회문인지 다시 확인합니다.
- 이를 위해 문자열의 첫 번째 문자와 마지막 문자를 제거한 후(text[1:-1]), is_palindrome() 함수를 재귀적으로 호출합니다.
예를 들어 "racecar"라는 문자열이 주어졌을 때:
- "r"과 "r"을 비교 (같음)
- "aceca"에 대해 재귀적으로 검사
- "a"와 "a"를 비교 (같음)
- "cec"에 대해 재귀적으로 검사
- "c"와 "c"를 비교 (같음)
- "e"에 대해 재귀적으로 검사 (이 경우 문자 하나만 남았으므로 회문임이 확정)