문제
거꾸로 배열해도 같은 단어 혹은 문장이 되는 것을 회문(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
- .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
코드 설명
- x.lower()
- 문자열을 소문자로 변환해 대소문자 차이를 무시합니다.
예: "My gym" → "my gym"
- 문자열을 소문자로 변환해 대소문자 차이를 무시합니다.
- replace(" ", "")
- 문자열의 모든 공백을 제거합니다.
예: "my gym" → "mygym"
- 문자열의 모든 공백을 제거합니다.
- 슬라이싱 [::-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]'의 의미:
- 알파벳(대소문자)과 숫자가 아닌 모든 문자를 찾는다. 주로 특수문자 제거나 데이터 정리에 사용.
'Python' 카테고리의 다른 글
데이터 전처리: 결측치 탐지와 처리 방법 (0) | 2024.12.03 |
---|---|
4.2.4 연습 문제: 각 자리 숫자의 합을 구하는 함수(리스트를 이용) (0) | 2024.11.29 |
4.2.2 슬라이싱 (0) | 2024.11.29 |
4.2.1. 연습 문제: 아이돌 팬 (1) (1) | 2024.11.29 |
4.2 문자열과 리스트 (1) | 2024.11.29 |