파이썬에서 부동 소수점(floating point) 숫자가 짝수인지 홀수인지 판별해야 하는 경우가 있습니다. 정수라면 마지막 자릿수를 2로 나누어 보면 쉽게 알 수 있지만, 부동 소수점 숫자는 그렇게 간단하지 않습니다. 소수점 아래 자릿수까지 함께 고려해야 하기 때문입니다.
예를 들어 입력이 n = 200.290이라고 해보겠습니다. 겉보기에는 마지막 자릿수가 0이라 짝수처럼 보이지만, 실제 출력은 "Odd"(홀수)입니다. 소수점 이하에서 0이 아닌 가장 오른쪽 유효 숫자가 9이기 때문입니다. 즉, 부동 소수점 숫자의 홀짝은 소수부의 유효 숫자 중 가장 오른쪽 값을 기준으로 판단해야 합니다.
해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- 주어진 숫자를 문자열로 변환합니다.
- 플래그(flag) 변수를 False로 초기화합니다. (소수점을 만났는지 여부를 추적)
- 문자열의 맨 뒤에서부터 앞쪽으로 한 글자씩 검사합니다.
- 현재 문자가 '0'이고 플래그가 False라면, 아직 의미 없는 뒷자리 0이므로 건너뜁니다.
- 현재 문자가 '.'이라면 플래그를 True로 바꾸고 다음 문자로 넘어갑니다.
- 현재 문자가 짝수라면 "Even"을 반환합니다.
- 짝수가 아니라면 "Odd"를 반환합니다.
예제 코드
def solve(n):
s = str(n)
flag = False
for i in range(len(s) - 1, -1, -1):
# 소수점을 만나기 전까지 뒤에 붙은 0은 무시
if s[i] == '0' and flag == False:
continue
if s[i] == '.':
flag = True
continue
if int(s[i]) % 2 == 0:
return "Even"
return "Odd"
n = 200.290
print(solve(n))입력
200.290
출력
Odd
코드 동작 원리
위 코드가 동작하는 과정을 단계별로 살펴보겠습니다. 문자열 "200.290"을 뒤에서부터 검사하면 다음과 같습니다.
- 마지막 문자 '0'은 아직 소수점을 만나기 전의 불필요한 0이므로 무시하고 건너뜁니다.
- 다음 문자 '9'는 유효 숫자이며, 9 % 2 == 1이므로 홀수입니다. 따라서 즉시 "Odd"를 반환합니다.
만약 입력이 200.292였다면 마지막 유효 숫자가 2이므로 "Even"이 출력됩니다. 또한 200.000처럼 소수부가 모두 0인 경우에는 소수점을 지난 뒤 정수부의 마지막 자릿수(여기서는 0)를 기준으로 판별하게 됩니다.
복잡도 분석
시간 복잡도는 숫자의 자릿수에 비례하여 O(d)(d는 문자열 길이)이며, 공간 복잡도 역시 문자열 저장을 위해 O(d)입니다. 자릿수가 많은 수라도 선형 시간 안에 빠르게 판별할 수 있습니다.
참고 사항
이 방식은 숫자를 문자열로 다루기 때문에 직관적이지만, 지수 표기법(예: 1e+20)으로 표현되는 매우 크거나 작은 부동 소수점 값에는 적합하지 않을 수 있습니다. 실제 프로젝트에서는 입력 형태를 먼저 확인하고 필요에 따라 전처리 과정을 추가하는 것이 좋습니다.