Wednesday, May 13, 2015

Project Euler #32 - pandigital products

프로젝트 오일러 32번
39*186=7254 처럼 1~9가 한번씩 나오는 곱셈을 모두 찾고 이 때의 곱을 모두 더하라라

작은 수를 x, 큰 수를 y 라고 하면, x, y, x*y의 자리수는 이런 조합이 가능하다.
1, 4, 4
2, 3, 4
다른 경우는 생각할 수 없다.
그럼 x는 2 이상 99 이하(정확히는 98 이하), y는 100이상(정확히는 123이상).

한 줄로 쓰면..
print sum(set(x*y for x in range(2,100) for y in range(123,4000) if ''.join(sorted(str(x)+str(y)+str(x*y))) == '123456789'))

1초 걸린다.

x*y가 4자리를 넘어가면 더 이상 계산할 필요가 없으니 이렇게 고쳐도 된다.

for x in range(2,100):
    for y in range(123,4000):
        if ''.join(sorted(str(x)+str(y)+str(x*y))) == '123456789':
            print x, y, x*y
        if x*y>10000: break

그럼, 0.08초

No comments: