Wednesday, May 6, 2015

Project Euler #28 - Number spiral diagonals

프로젝트 오일러 28번
나선형으로 숫자를 나열한 다음 대각선 숫자들을 모두 더하면?

a, b, c, d = [1], [], [], []
for i in range(1,501):
    a.append(a[-1]+i*8)
    b.append(a[-1]-2*i)
    c.append(a[-1]-4*i)
    d.append(a[-1]-6*i)

print sum(a)+sum(b)+sum(c)+sum(d)

1번 문제와 비슷하다. 고등학교 때 배운 n을 더하는 공식, n^2을 더하는 공식으로 열심히 풀어 보면...
sum(a) = 1 + 9 + 25 + .. 
= sum ( (2n-1)^2 )
= sum ( 4n^2 - 4n + 1)
= 4 * n * (n+1) * (2n+1) / 6 - 4 * n * (n+1) / 2 + n   <= n=501
= 167668501

비슷한 방법으로 sum(b), sum(c), sum(d) 를 계산할 수... 굳이 따로 계산하지 않더라도 a[-1] - 12*i 로 계산할 수 있다.
sum(b+c+d) = (sum(a)-1) * 3 - 500*501/2*12

답은 나왔지만.. 이쯤 되면 코딩이 훨씬 편하다. 계산 실수도 없고.

No comments: