데이터 분석

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"라는 문자열이 주어졌을 때:

  1. "r"과 "r"을 비교 (같음)
  2. "aceca"에 대해 재귀적으로 검사
  3. "a"와 "a"를 비교 (같음)
  4. "cec"에 대해 재귀적으로 검사
  5. "c"와 "c"를 비교 (같음)
  6. "e"에 대해 재귀적으로 검사 (이 경우 문자 하나만 남았으므로 회문임이 확정)