Sunday, May 17, 2015

Project Euler #36 - 거꾸로 해도 같은 수

프로젝트 오일러 36번
100만 이하의 수 중에서, 10진수로 하든 2진수로 하든 거꾸로 해도 자기자신이 되는 수를 모두 더하면?

33 = 100001 (2) 같은 것도 되지만, 313 = 100111001 같은 경우도 고려해야 한다.

def d2b(d):
    b = ''
    while True:
        b += str(d%2)
        d /= 2
        if d == 0: return b == b[::-1]

sm = 0
for i in ['']+[str(x) for x in range(1,1000)]:
    for j in ['']+[str(x) for x in range(10)]:
        s = str(i)+str(j)+str(i)[::-1]
        if len(s) >= 1 and len(s) <= 6:
            pd = int(s)
            if d2b(pd):
                sm += pd

print sm

0.03~0.05초 정도 걸린다.

d2b함수는 10진수를 2진수(정확히는 2진수를 거꾸로 쓴 수)를 찾고 그게 palindrome인지 체크한다.
i는 10진수로 했을 때 왼쪽 절반을, j는 가운데 숫자를 의미한다.
i=58, j=3 => 58385
i = 2, j='' => 22
i = '', j=7 => 7

컴퓨터 내부적으로는 2진수가 기본일테니 여기에서처럼 10진수를 2진수로 바꾸는 대신, 2진수를 기본으로 palindrome을 만들고, 조건에 맞을 때 10진수로 변환해서 palindrome인지 체크하는 게 더 빠를 것 같은데.. 어떻게 하는지도 모르겠고, 지금 속도도 문제가 되지 않는 듯 해서 패쓰~


No comments: