프로젝트 오일러 036

10진법으로도 2진법으로도 모두 대칭수가 되는 백만보다 작은 수들의 합

프로젝트 오일러 036
Photo by Sanibell BV / Unsplash

문제

36번 문제
10진법과 2진법으로 모두 대칭수인 1,000,000 미만 수의 합

대칭수

대칭수를 판별하는 방법에는 여러 가지가 있는데, 전통적인 C언어 교재에서는 길이가 L인 배열이 대칭인지를 검사할 때, 0번 위치의 값과 맨 끝 그러니까, (L - 1) 위치의 값을 검사합니다. 그리고 1번 위치와 (L - 2) 위치의 값을 검사합니다. 이런식으로 대칭이라면 서로 같아야 하는 위치의 값을 검사하여 L / 2 까지 검사하여 모두 일치하였다면 대칭으로 판단합니다.

하지만 굳이 파이썬에서는 그럴 필요가 없는 것이, 1) for/while 루프의 성능이 좀 떨어지는데다, 2) 문자열로 변환하는 것이 심혈을 기울여 최적화되어 있기 때문에 그런대로 제법 쓸만합니다. 특히 이 문제에서는 문자열을 다시 정수로 변환할 필요도 없기 때문에 부담이 덜하고, 범위 역시 6자리 수까지만 있기 때문에 어려울 게 없습니다.

def is_palindrome(n: int) -> bool:
  s = tuple(f'{n}')
  b = tuple(bin(n)[2:])
  return s == s[::-1] and b == b[::-1]

print(sum(x for x in range(1, 100_0000, 2)))

또한 2진법으로 표기할 때 끝자리가 1인 수는 모두 홀수이기 때문에 검사해야 하는 범위도 더 좁습니다.