주어진 범위 사이에 있는 숫자 중 홀수이면서 동시에 회문(palindrome)인 모든 숫자를 찾아야 하는 경우가 있습니다. 이때 재귀 함수를 사용하지 않고 해결하려면 리스트 컴프리헨션(list comprehension)과 '%' 연산자를 활용하면 간단하게 구현할 수 있습니다.
회문이란 왼쪽에서 오른쪽으로 읽어도, 오른쪽에서 왼쪽으로 읽어도 같은 문자열을 의미합니다. 예를 들어 121, 13331처럼 앞뒤가 똑같은 숫자가 여기에 해당합니다.
예제 코드
my_list = []
lower_limit = 5
upper_limit = 189
print("하한값 : ")
print(lower_limit)
print("상한값 : ")
print(upper_limit)
my_list = [x for x in range(lower_limit, upper_limit+1) if x%2 != 0 and str(x) == str(x)[::-1]]
print(str(lower_limit) + "부터 " + str(upper_limit) + " 사이의 홀수이면서 회문인 숫자들 : ")
print(my_list)실행 결과
하한값 : 5 상한값 : 189 5부터 189 사이의 홀수이면서 회문인 숫자들 : [5, 7, 9, 11, 33, 55, 77, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181]
코드 설명
- 빈 리스트와 하한값(lower limit), 상한값(upper limit)을 정의합니다.
- 정의된 상한값과 하한값을 콘솔에 출력합니다.
- 리스트 컴프리헨션을 사용해 범위 내의 모든 값을 순회하면서, '%' 연산자로 해당 값이 2로 나누어지지 않는지(즉, 홀수인지) 확인합니다.
- 동시에 숫자를 문자열로 변환한 뒤, 슬라이싱(
[::-1])을 통해 문자열을 뒤집은 것과 원래 문자열을 비교하여 회문 여부를 판별합니다. - 두 조건을 모두 만족하는 값들만 리스트에 저장됩니다.
- 최종 결과 리스트를 콘솔에 출력합니다.
핵심 포인트 정리
x % 2 != 0: 나머지 연산자를 활용해 홀수 여부를 검사합니다.str(x) == str(x)[::-1]: 파이썬의 슬라이싱 기법으로 문자열을 역순으로 만들어 회문인지 확인합니다.- 재귀 호출 없이 한 줄의 리스트 컴프리헨션으로 조건 필터링이 가능하여 코드가 간결하고 가독성이 뛰어납니다.