문제 개요
영숫자(alphanumeric)로 구성된 문자열 s가 있다고 가정해 보겠습니다. 이 문자열에는 대문자와 소문자가 섞여 있을 수 있으며, 숫자도 포함될 수 있습니다. 우리가 해야 할 일은 소문자 알파벳만 추출했을 때 해당 문자열이 회문(palindrome)인지 확인하는 것입니다.
예를 들어, 입력이 s = "rLacHEec0a2r8"이라면 출력은 True가 됩니다. 이 문자열에서 소문자만 모으면 "racecar"가 되는데, 이는 앞에서 읽어도 뒤에서 읽어도 같은 회문이기 때문입니다.
해결 접근 방법
이 문제는 다음 단계를 따라 간단히 해결할 수 있습니다.
- 빈 문자열 x를 생성합니다.
- 문자열 s의 각 문자 i에 대해 반복합니다.
- i가 소문자라면 x에 해당 문자를 이어 붙입니다.
- x가 회문이면 true를, 그렇지 않으면 false를 반환합니다.
예제 코드
아래 파이썬 구현 예시를 통해 더 자세히 이해해 보겠습니다.
def solve(s):
x = ""
for i in s:
if i.islower():
x += i
return x == x[::-1]
s = "rLacHEec0a2r8"
print(solve(s))
입력
"rLacHEec0a2r8"
출력
True
코드 설명
위 코드의 핵심 요소를 살펴보겠습니다.
islower(): 문자가 소문자인지 판별하는 파이썬 내장 메서드입니다. 대문자나 숫자는 자동으로 걸러집니다.x[::-1]: 문자열 슬라이싱 기법으로, 문자열을 거꾸로 뒤집습니다. 원본 문자열과 뒤집은 문자열이 동일하면 회문입니다.
이 알고리즘은 문자열을 한 번씩만 순회하므로 시간 복잡도는 O(n)이며, 매우 효율적입니다. 참고로 더 파이썬다운 방식으로는 ''.join(c for c in s if c.islower())처럼 리스트 컴프리헨션을 활용해 한 줄로 소문자를 추출할 수도 있습니다.