Monday, May 25, 2015

Project Euler #45 - Triangular, pentagonal, and hexagonal

프로젝트 오일러 45번
삼각, 오각, 육각수가 모두 되는 수는?
40755는 세 성질을 모두 만족한다. 세 성질을 모두 만족하는 40755 다음의 수는?

예전에 작성했던 코드 - 약 0.1초

i,j,k=285,165,143
a, b, c = 40755, 40755, 40755
while True:
    mn = min(a,b,c)
    if a == mn: a += i+1; i += 1
    elif b == mn: b += 3*j+1; j += 1
    elif c == mn: c += 4*k+1; k += 1
    if a == b == c and a > 40755:
        print i,j,k,a
        break


그런데, "모든 육각수는 삼각수"라는 성질(포럼에서 봤어요~)을 이용하면 a, i와 관련된 코드를 모두 없앨 수 있다. 위에서 가장 많이 업데이트 되는 게 a라는 점 때문에.. 이렇게 하면 반 이하로 실행시간이 줄어든다.

j,k=165,143
b, c = 40755, 40755
while True:
    mn = min(b,c)
    if b == mn: b += 3*j+1; j += 1
    elif c == mn: c += 4*k+1; k += 1
    if b == c and b > 40755:
        print j,k,b
        break


No comments: