본문 바로가기
Project Euler

Problem 2 - Even Fibonacci numbers

by 청양호박이 2019. 11. 19.

이번 문제는 Fibonacci 수의 특정값까지의 합을 구하는 문제입니다. 하지만 여기에는 조건이 몇가지 있습니다. 단순히 해당 문제를 풀기위한 방법과, Algorithm 문제를 푸는 방식으로 여러개의 Test_Case가 들어오고 약간 도전적인 목표의 특정값을 해결할 수 있도록 해보겠습니다.

 

1. 주어진 조건의 문제 해결


제약조건은 아래와 같습니다.

  • 400만 이하의 Fibonacci를 대상으로 함
  • 그 중에서 짝수인 값의 합을 구함

저는 우선 Fibonacci가 400만까지 가려면 얼마나 많은 단계를 거쳐야 하는지 궁금해졌습니다. 그래서 관련 코드를 대충 짜보면...

a, b = 1, 2
cnt = 0
while True:
    temp = a + b
    if temp > 4000000: break
    print(temp)
    a = b
    b = temp    
    cnt += 1

print(cnt)

은근 cnt가 클거라고 생각했는데... 

 

3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 (총 30개) 밖에 안되네요...;;

 

그럼 그냥 짝수만 더해볼까요??

a, b = 1, 2
res = 2
while True:
    temp = a + b
    if temp > 4000000: break
    a = b
    b = temp    
    if b & 1 == 0: res += b

print(res)

 

 

2. 도전적인 목표 해결


보통 Alogithm 문제들은 제약조건이 Test_Case 몇개에 최대가능한 input 값이 지정되고 응답시간이 몇초이내... 이렇게 되어있습니다. 그래서 유사하게 만들어 보겠습니다.

  • Test_Case <= 10000
  • Max Input Target <= 4e16

이번에는 최대치가 무려 4의 16승입니다. 그럼 이걸 넘어서기까지 Fibonacci가 몇단계까지 가야할까요??

a, b = 1, 2
cnt = 0
while True:
    temp = a + b
    if temp > 4e16: break
    a = b
    b = temp    
    cnt += 1

print(cnt)

78단계 입니다.

 

Test_Case가 10000개나 되고, 매번 Test_Case마다 해당 숫자까지 Fibonacci를 계산한다면 비효율 적이라고 생각됩니다. 물론 해당 제약조건을 해결하는데는 큰 효율을 기대하긴 어렵겠지만요... 그래서 저는 Fibonacci를 한번에 계산해 놓고 각 Test_Case마다 계산해 놓은 결과에 짝수만 찾아서 더하기로 하겠습니다. 

 

def preCalcFibo():
    res = [1, 2]
    for i in range(2, 100):
        temp = res[i-2]+res[i-1]
        if temp > 4e16: break
        res.append(temp)
    return res 


if __name__ == '__main__':
    fiboList = preCalcFibo()

    tc = int(input())
    for i in range(tc):
        targetNo = int(input())
        ans = 0
        for i in range(len(fiboList)):
            if fiboList[i] & 1 == 0 and fiboList[i]<=targetNo:
                ans += fiboList[i]

        print(ans)

저는 이렇게 해결해 보았습니다. 다른분들은 어떻게 해결하셨을지 궁금하네요~

 

-Ayotera Lab-

 

 

댓글