티스토리 뷰

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import math
judgement=False
def sieve(n):
    if n < 2:
        return []
    s = [00+ [1* (n - 1)
    for i in range(2int(n**.5)+1):
        if s[i]:
            s[i*2::i] = [0* ((n - i)//i)
    return [i for i, v in enumerate(s) if v]
def isPrime(n):
    if(n==1):
        return False
    count=0
    for i in range(2,(int)(math.sqrt(n))+1):
        if(n%i==0):
            count=count+1
    if(count==0):
        return True
    else:
        return False
arr_prime=sieve(1000)
def primeFact(n):
    arr=[]
    for i in range(0,len(arr_prime)):
        prime=arr_prime[i]
        if(n%prime==0):
            arr.append(prime)
            n=(int)(n/prime)
        if(isPrime(n)):
            arr.append(n)
            break
    arr=list(set(arr))
    arr.sort()
    return arr
arr_number=[]
arr_real=[]
for i in range(1,140000):
    if(len(primeFact(i))==4):
        arr_number.append(i)
        arr_real.append(primeFact(i))
        if(len(arr_number)==4):
            if(arr_number[0]+1==arr_number[1and arr_number[0]+2==arr_number[2
               and arr_number[0]+3==arr_number[3]):
                for i in range(0,3):
                    for j in range(0,4):
                        for k in range(0,4):
                            if(arr_real[i][j]!=arr_real[i+1][k]):
                                judgement=True
                            else:
                                judgement=False
                                break
                        if(judgement==False):
                            break
                    if(judgement==False):
                        break
                if(judgement==True):
                    print(arr_number[0])
                    break
            else:
                arr_number.remove(arr_number[0])
                arr_real.remove(arr_real[0])
#반환 시간 : 59.6s
cs


솔직히 이번 문제는 어거지로 풀었다.



일단 소수를 구할 수 있는 모든 알고리즘은 다 함수로 정의했다.


isPrime()은 소수 판정에 사용되었고


sieve()는 에라토스테네스의 체를 활용하여 소인수의 후보를 미리 리스트에 저장하는 데 사용되었다.


(출처 : http://codingdojang.com/scode/503)


primeFact()는 소인수분해를 한 결과를 리스트에 저장호 중복 제거, 오름차순 정렬을 한 후 반환해주는 함수이다.



먼저 소인수분해 결과의 리스트의 길이를 세어 4일 때 판정을 시작하도록 하였다.


연속되는 숫자인지 확인하기 위해 리스트의 길이가 4인 숫자를 또 다른 리스트에 저장하였고,


소인수분해한 결과 또한 또 다른 리스트에 저장하였다.


그러다가 연속되는 숫자인지 확인하기 위한 리스트의 길이가 4가 되면


각 요소를 비교하여 연속되는 숫자이면 리스트들을 출력하도록 하였고


그렇지 않으면 리스트의 맨 앞에 위치하는 요소를 리스트에서 제거하였다.



1부터 쭉 돌려본 결과 정답인 부분에서 처음으로 콘솔에 데이터가 출력되었는데


운좋게도 그 부분에서 모든 조건에 부합하여 정답을 낼 수 있었다.



이후 소인수분해 리스트의 각 요소를 비교하는 코드를 넣어 좀 더 나은 코드를 만들었지만


뭔가 효율적이지 않은 것 같고 시간도 1분 정도 걸렸기 때문에


더 좋은 방법을 찾아봐야 할 것이다.




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

프로젝트 오일러 57번  (0) 2017.07.08
프로젝트 오일러 45번  (0) 2017.07.08
프로젝트 오일러 52번  (0) 2017.07.08
프로젝트 오일러 2페이지 클리어!  (0) 2017.07.08
프로젝트 오일러 26번  (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
글 보관함