프로젝트 오일러 - 문제 2번
피보나치 수열이란? 첫 번째 원소와 두 번째 원소의 합은 세 번째 원소가 되고, 두 번째 원소와 세 번째 원소의 합은 네 번째가 된다. 이것이 계속 반복된다.
피보나치(Fibonacci) 수열의 각 항은 바로 앞의 항 두 개를 더한 것입니다. 1과 2로 시작하는 경우 이 수열은 아래와 같습니다. 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 4백만 이하의 짝수 값을 갖는 모든 피보나치 항을 더하면 얼마가 됩니까?
해결 방법
def solution(a, b, limit):
numbers = [a, b]
result = []
if a % 2 == 0:
result.append(a)
if b % 2 == 0:
result.append(b)
i = 0
while True:
res = numbers[i] + numbers[i+1]
if res > limit:
break
numbers.append(res)
if res % 2 == 0:
result.append(res)
i += 1
return sum(result)
print(solution(1, 2, 4000000)) # 4613732
개선된 코드
(프로젝트 오일러 다른이의 코드를 보고) 배열을 안써도 되는구나! 평가항목도 줄어들고, 변수도 바꿔쓰니 훨씬 좋은 알고리즘인듯
def solution(a, b, limit):
sum = 0
while a < limit:
if b % 2 == 0:
sum += b
num = a + b
a = b
b = num
return sum
print(solution(1, 2, 4000000))
프로젝트 오일러에 있는 다른이의 코드중에서
cap = 4000000
i = 2 #current fib num
j = 1 #previous fib num
sum = 0
while i < cap:
if(i % 2 == 0): #Only sum even values of fibinnaci
sum += i; #sum current i
#i Calc and Var Swap
temp = i #hold i temporarily
i += j #calculate new fib num
j = temp #update j to old i
print(sum)
'프로그래밍 > 알고리즘' 카테고리의 다른 글
1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수 (0) | 2021.01.25 |
---|---|
세자리 수를 곱해 만들 수 있는 가장 큰 대칭수 (0) | 2021.01.24 |
가장 큰 소인수 구하기 (0) | 2021.01.23 |
1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면? (0) | 2021.01.21 |
두 개 뽑아서 더하기 (0) | 2021.01.20 |