Python

4.2.3 연습 문제: 회문 판별 함수 만들기

수현조 2024. 11. 29. 11:21

문제

거꾸로 배열해도 같은 단어 혹은 문장이 되는 것을 회문(palindrome)이라고 합니다. 다음은 회문의 예입니다.

  • Anna
  • Civic
  • Kayak
  • Level
  • ...

문제 1

주어진 단어가 회문인지 판별하는 함수 palindrome()을 작성하세요. 단, 문자열 입력은 모두 소문자로 이뤄지며 공백을 포함하지 않는다고 가정합니다.

>>> palindrome('anna')
True
>>> palindrome('banana')
False

  • x[::-1] #문자열을 뒤집는다
  • x == x[::-1]  #원래 문자열과 뒤집은 문자열이 같은지 비교한다

 

 

문제 2

대문자와 소문자가 섞여 있더라도 회문으로 판정하도록 함수를 개선하세요.

>>> palindrome('Anna')
True

  • x = x.lower()  #대문자를 소문자로 변환 -> 대문자가 있어도 회문판별 가능

문제 3

공백이 섞여 있더라도 회문으로 판정하도록 함수를 개선하세요.

>>> palindrome('My gym')
True

1트
개선했다.

  • .split()  #문자열을 단어별로 나눔
  • .join() #나눠진 단어를 공백 없이 합침

tip문자열의 lower() 메서드를 이용해 소문자만으로 이루어진 문자열을 얻을 수 있습니다.

>>> 'Python'.lower()
'python'

그리고 replace() 메서드를 이용해 문자열 일부를 다른 문자열로 바꾼 문자열을 얻을 수 있습니다.

>>> 'Python'.replace('P', 'J')
'Jython'

네! replace() 메서드를 사용해서 공백을 제거하고 회문 판별을 해결할 수 있습니다.

**replace()**는 문자열 내 특정 문자나 패턴을 다른 문자로 교체할 때 사용하는 메서드예요.


replace()를 이용한 회문 판별

수정된 코드

def palindrome(x):     # 대소문자 무시, 공백 제거
    y = x.lower().replace(" ", "") # 회문 판별
    return y == y[::-1]

# 테스트
print(palindrome("My gym"))       # 출력: True
print(palindrome("A Santa at NASA"))  # 출력: True
print(palindrome("Hello, World")) # 출력: False

코드 설명

  1. x.lower()
    • 문자열을 소문자로 변환해 대소문자 차이를 무시합니다.
      예: "My gym" → "my gym"
  2. replace(" ", "")
    • 문자열의 모든 공백을 제거합니다.
      예: "my gym" → "mygym"
  3. 슬라이싱 [::-1]
    • 문자열을 뒤집어서 원래 문자열과 같은지 비교합니다.
      예: "mygym" == "mygym[::-1]" → True.

테스트 결과

입력값

print(palindrome("My gym"))              # 출력: True
print(palindrome("A Santa at NASA"))     # 출력: True
print(palindrome("Hello, World"))        # 출력: False
print(palindrome("No lemon, no melon"))  # 출력: True

결과

  • "My gym": 공백과 대소문자를 무시하면 회문 → True.
  • "Hello, World": 회문이 아님 → False.

오옹 신기하다

장점과 단점

장점

  • 간단하고 직관적: 공백만 제거하면 되는 경우 replace()가 깔끔하게 처리합니다.

단점

  • 특수문자 제거는 불가능: 예를 들어, 쉼표나 느낌표 같은 문자를 처리하려면 re.sub() 같은 정규식을 써야 합니다.

특수문자까지 제거하고 싶다면?

특수문자도 제거하려면 아래 코드처럼 정규식 **re.sub()**을 사용합니다.

import re

def palindrome(x):
    # 특수문자와 공백 제거, 소문자로 변환
    y = re.sub(r'[^a-zA-Z0-9]', '', x.lower())
    return y == y[::-1]

print(palindrome("A man, a plan, a canal: Panama"))  # 출력: True
print(palindrome("Hello, World!"))                  # 출력: False

1. re.sub(pattern, replacement, string):

  • pattern: 제거할 문자 패턴.
  • replacement: 교체할 문자열. (여기서는 빈 문자열 "")
  • string: 적용할 대상 문자열.

2. r'[^a-zA-Z0-9]'의 의미:

  • 알파벳(대소문자)과 숫자가 아닌 모든 문자를 찾는다. 주로 특수문자 제거데이터 정리에 사용.