티스토리 뷰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import math
def isOhgak(n):
    if(n==0):
        return False
    i=(int)(((math.sqrt(1+8*n)+1)/4))
    while((int)(i*(3*i-1)/2)!=n):
        i=i+1
        if((int)(i*(3*i-1)/2)>n):
            return False
    return True
def isYookgak(n):
    if(n==0):
        return False
    i=(int)(((math.sqrt(1+8*n)+1)/4))
    while((int)(i*(2*i-1))!=n):
          i=i+1
          if((int)(i*(2*i-1))>n):
             return False
    return True
arr=[]
count=0
for i in range(1,1000000):
    arr.append((int)(i*(i+1)/2))
for i in range(0,len(arr)):
    if(isOhgak(arr[i]) and isYookgak(arr[i])):
        count=count+1
        if(count==3):
            print(arr[i])
            break
#반환 시간 : 89.3s
cs




삼각수이면서 오각수이면서 육각수인 수를 찾으란다.


그래서 오각수임을 판정하는 함수와 육각수임을 판정하는 함수를 만들었고


일정 범위의 삼각수를 한 리스트에 몰아넣은 후 각 요소에 대한 오각수/육각수 판정을 시행했다.



처음에는 판정 함수에서의 i의 시작값을 0으로 두어 결과가 빠르게 나오지 않아


육각수를 판정하는 수식의 해를 i의 시작값으로 두었고


빠르진 않았지만 정답이 나왔다.



이번 문제부터 반환 시간을 측정해보기로 하였다.


딱 보기에 반환 시간이 너무 길다 싶은 문제를 쉽게 찾아서 다시 생각하게 할 수 있을 것이다.

'Algorithm > Project Euler' 카테고리의 다른 글

프로젝트 오일러 58번  (0) 2017.07.08
프로젝트 오일러 57번  (0) 2017.07.08
프로젝트 오일러 47번  (0) 2017.07.08
프로젝트 오일러 52번  (0) 2017.07.08
프로젝트 오일러 2페이지 클리어!  (0) 2017.07.08
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함