project euler 32

오일러 프로젝트 32 번

1부터 n까지의 각 숫자를 한번씩만 써서 만들 수 있는 숫자를 팬디지털(pandigital)이라고 합니다.
예를 들면 15234는 1부터 5의 숫자가 한번씩만 쓰였으므로 1 ~ 5 팬디지털입니다.

7254라는 숫자는 그런 면에서 특이한데, 39 × 186 = 7254 라는 곱셈식을 만들 때 이것이 1 ~ 9 팬디지털이 되기 때문입니다.

이런 식으로 a × b = c 가 1 ~ 9 팬디지털이 되는 모든 c의 합은 얼마입니까?

(참고: 어떤 c는 두 개 이상의 (a, b)쌍에 대응될 수도 있는데, 이런 경우는 하나로 칩니다)

http://euler.synap.co.kr/prob_detail.php?id=32

팬디지털 숫자인지 확인해보는 것은 정렬해서 “123456789” 인지만 보면 된다. 케이스는 2자리x4자리=4자리, 3자리x3자리=3자리의 경우가 있을 수 있으므로 이 범위만 체크한다.

def check_pandigital(a, b):
    c = a * b
    d = "%d%d%d" % (a, b, c)
    return "".join(sorted(d)) == "123456789"

def e32():
    s = set()
    for a in range(1,10):
        for b in range(1234,9999):
            if check_pandigital(a, b):
                s.add(a*b)
    for a in range(12, 100):
        for b in range(123,1000):
            if check_pandigital(a, b):
                s.add(a*b)
    print(sum(s))

%time e32()

# 45228
# Wall time: 548 ms