Python 에서 문자열이 회문인지 확인하는 방법

PythonBeginner
지금 연습하기

소개

이 랩에서는 Python 에서 문자열이 회문 (palindrome) 인지 확인하는 방법을 배우게 됩니다. 회문은 "madam" 또는 "racecar"와 같이 뒤에서 앞으로 읽어도 동일한 문자 시퀀스입니다.

이 랩은 회문을 식별하는 is_palindrome 함수를 정의하는 Python 스크립트를 만드는 과정을 안내합니다. 여기에는 입력 텍스트를 소문자로 변환하고 공백을 제거하여 처리한 다음, 처리된 텍스트를 뒤집힌 버전과 비교하는 작업이 포함됩니다. 또한 예시 단어로 함수를 테스트하는 방법도 배우게 됩니다.

회문 정의

이 단계에서는 회문의 개념과 Python 을 사용하여 이를 식별하는 방법을 살펴보겠습니다. 회문은 단어, 구, 숫자 또는 뒤에서 앞으로 읽어도 동일한 다른 문자 시퀀스입니다. 예시로는 "madam", "racecar", "level" 등이 있습니다.

시작하기 위해, 회문이 무엇인지 정의하는 Python 스크립트를 만들어 보겠습니다.

  1. LabEx 환경에서 VS Code 편집기를 엽니다.

  2. ~/project 디렉토리에 palindrome.py라는 새 파일을 만듭니다.

    탐색기 패널 (일반적으로 왼쪽) 에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택하여 새 파일을 만들 수 있습니다. 파일을 ~/project 디렉토리에 palindrome.py로 저장해야 합니다.

  3. palindrome.py 파일에 다음 Python 코드를 추가합니다.

    def is_palindrome(text):
        processed_text = ''.join(text.lower().split())
        return processed_text == processed_text[::-1]
    
    ## Example usage
    word = "madam"
    if is_palindrome(word):
        print(f"'{word}' is a palindrome")
    else:
        print(f"'{word}' is not a palindrome")

    이 코드를 자세히 살펴보겠습니다.

    • def is_palindrome(text):: 이 줄은 문자열 text를 입력으로 받는 is_palindrome이라는 함수를 정의합니다.
    • processed_text = ''.join(text.lower().split()): 이 줄은 회문 검사를 위해 입력 텍스트를 준비합니다. 먼저 .lower()를 사용하여 텍스트를 소문자로 변환한 다음, .split()을 사용하여 문자열을 단어 목록으로 분할하고, ''.join()을 사용하여 단어를 공백 없이 단일 문자열로 다시 결합하여 모든 공백을 제거합니다.
    • return processed_text == processed_text[::-1]: 이 줄은 처리된 텍스트를 뒤집힌 텍스트와 비교합니다. processed_text[::-1]은 문자열의 뒤집힌 복사본을 만듭니다. 처리된 텍스트가 뒤집힌 텍스트와 같으면 함수는 True를 반환합니다 (회문임). 그렇지 않으면 False를 반환합니다.
    • 함수 정의 뒤의 줄은 예시 사용법입니다. "madam" 단어로 is_palindrome 함수를 호출하고 회문인지 아닌지를 출력합니다.
  4. 이제 스크립트를 실행해 보겠습니다. WebIDE 에서 터미널을 엽니다. 일반적으로 VS Code 인터페이스 하단에서 터미널 탭을 찾을 수 있거나, 메뉴: Terminal -> New Terminal 을 통해 새 터미널을 열 수 있습니다.

  5. 터미널에서 ~/project 디렉토리로 이동합니다 (아직 이동하지 않은 경우).

    cd ~/project
  6. Python 스크립트를 실행합니다.

    python palindrome.py
  7. 다음 출력을 볼 수 있습니다.

    'madam' is a palindrome

    이것은 스크립트가 "madam"을 회문으로 올바르게 식별함을 확인합니다.

뒤집기 및 비교

이 단계에서는 is_palindrome 함수가 어떻게 작동하는지 더 자세히 알아보기 위해 입력 문자열을 명시적으로 뒤집은 다음 원래 문자열과 비교합니다. 이렇게 하면 회문 식별 프로세스를 더 명확하게 이해할 수 있습니다.

  1. VS Code 편집기에서 palindrome.py 파일을 엽니다. 이 파일은 이전 단계에서 만든 파일과 동일합니다.

  2. palindrome.py에서 is_palindrome 함수를 수정하여 문자열을 명시적으로 뒤집습니다.

    def is_palindrome(text):
        processed_text = ''.join(text.lower().split())
        reversed_text = processed_text[::-1]  ## Explicitly reverse the string
        return processed_text == reversed_text
    
    ## Example usage
    word = "madam"
    if is_palindrome(word):
        print(f"'{word}' is a palindrome")
    else:
        print(f"'{word}' is not a palindrome")
    
    word2 = "hello"
    if is_palindrome(word2):
        print(f"'{word2}' is a palindrome")
    else:
        print(f"'{word2}' is not a palindrome")

    변경 사항은 다음과 같습니다.

    • reversed_text = processed_text[::-1]: 이 줄은 processed_text 문자열의 뒤집힌 복사본을 생성하고 이를 변수 reversed_text에 할당합니다.
    • return processed_text == reversed_text: 이 줄은 이제 원래 처리된 텍스트를 명시적으로 뒤집힌 텍스트와 비교합니다.
    • 회문이 아닌 단어를 보여주기 위해 "hello"라는 단어로 두 번째 예시를 추가했습니다.
  3. palindrome.py에 변경 사항을 저장합니다.

  4. 터미널에서 스크립트를 다시 실행합니다.

    python palindrome.py
  5. 이제 다음 출력을 볼 수 있습니다.

    'madam' is a palindrome
    'hello' is not a palindrome

    이 출력은 스크립트가 회문과 회문이 아닌 단어를 모두 올바르게 식별함을 확인합니다. 문자열을 명시적으로 뒤집음으로써 is_palindrome 함수의 논리를 더 투명하게 만들었습니다.

대소문자 및 공백 무시

이 단계에서는 회문이지만 공백과 대소문자가 혼합된 문자를 포함하는 구문을 처리하도록 is_palindrome 함수를 개선합니다. 예를 들어, "A man, a plan, a canal: Panama"는 공백, 구두점 및 대소문자를 무시하면 회문입니다.

  1. VS Code 편집기에서 palindrome.py 파일을 엽니다.

  2. 대소문자와 공백을 무시하도록 palindrome.pyis_palindrome 함수를 수정합니다.

    import re
    
    def is_palindrome(text):
        processed_text = re.sub(r'[^a-zA-Z]', '', text).lower()
        reversed_text = processed_text[::-1]
        return processed_text == reversed_text
    
    ## Example usage
    word1 = "A man, a plan, a canal: Panama"
    if is_palindrome(word1):
        print(f"'{word1}' is a palindrome")
    else:
        print(f"'{word1}' is not a palindrome")
    
    word2 = "Racecar"
    if is_palindrome(word2):
        print(f"'{word2}' is a palindrome")
    else:
        print(f"'{word2}' is not a palindrome")
    
    word3 = "hello"
    if is_palindrome(word3):
        print(f"'{word3}' is a palindrome")
    else:
        print(f"'{word3}' is not a palindrome")

    변경 사항을 자세히 살펴보겠습니다.

    • import re: 이 줄은 정규식 연산을 제공하는 re 모듈을 가져옵니다.
    • processed_text = re.sub(r'[^a-zA-Z]', '', text).lower(): 이 줄은 이제 정규식을 사용하여 입력 텍스트에서 문자가 아닌 모든 문자 (a-z, A-Z) 를 제거합니다. re.sub(r'[^a-zA-Z]', '', text)는 모든 문자 이외의 문자를 빈 문자열로 대체하여 효과적으로 제거합니다. 그런 다음, .lower()는 결과 문자열을 소문자로 변환합니다.
    • 업데이트된 함수를 테스트하기 위해 "A man, a plan, a canal: Panama", "Racecar" 및 "hello"를 사용한 예시를 추가했습니다.
  3. palindrome.py에 변경 사항을 저장합니다.

  4. 터미널에서 스크립트를 다시 실행합니다.

    python palindrome.py
  5. 이제 다음 출력을 볼 수 있습니다.

    'A man, a plan, a canal: Panama' is a palindrome
    'Racecar' is a palindrome
    'hello' is not a palindrome

    이 출력은 이제 스크립트가 공백, 구두점 및 대소문자가 혼합된 문자열도 올바르게 회문으로 식별함을 확인합니다. 정규식은 입력 텍스트를 효과적으로 정리하여 정확한 회문 감지를 가능하게 합니다.

요약

이 랩에서는 뒤에서 읽어도 앞으로 읽는 것과 동일한 문자열인 회문의 개념을 탐구하는 것으로 시작했습니다. 그런 다음 회문을 식별하는 is_palindrome(text) 함수를 포함하는 palindrome.py라는 Python 스크립트를 만들었습니다.

is_palindrome 함수는 먼저 입력 텍스트를 소문자로 변환하고 공백을 제거하여 전처리합니다. 그런 다음 처리된 텍스트를 뒤집힌 버전과 비교하여 회문인지 여부를 결정하고, 회문인 경우 True를, 그렇지 않은 경우 False를 반환합니다. 스크립트에는 또한 함수를 호출하고 결과를 출력하는 방법을 보여주는 예시 사용법이 포함되어 있습니다.