코딩테스트

피보나치수 개수 확인문제

temporubato108 2024. 9. 28. 20:45

지시사항

입력

- 첫번째 줄에 구간의 범위를 나타내는 자연수 a,b를 입력받는다.

1<=a<=b<=1000000

 

출력

첫번째 줄에 구간 [a,b]의 수 중에서 피보나치 수의 개수를 출력합니다.

 

입력예시

2 7

 

출력예시

3

 


 

처음에는 아래와 같은 코드를 작성했다.

a,b=map(int, input().split())
num={1:1, 2:2}
lst=[]
count=0

for i in range(a,b+1):
    lst.append(i) # [2,3,4,5,6]
if 1 in lst:
    count+=1
if 2 in lst:
    count+=1
for n in range(3,b):
    num[n]=num[n-1]+num[n-2]
    if num[n] in lst:
        count+=1
    elif num[n]>b:
        break
print(count)

 

 

만들고보니 카운트하는 방법이 정돈되어있지 못하다는 생각이 들었고

그것들을 수정한 코드가 아래이다.

 

a, b = map(int, input().split())
num = {1: 1, 2: 2}
lst = []
count = 0

for i in range(a, b + 1):
    lst.append(i)

n = 1
while True:
    if n >= 3:
        num[n] = num[n - 1] + num[n - 2]
    if num[n] > b:
        break
    if num[n] in lst:
        count += 1
    n += 1

print(count)

 

굳이 숫자 1,2를 따로 확인하지 않고, 자연스럽게 n=1부터 시작하여 하나의 while문으로 확인할 수 있도록 하였다.

그리고 이번에는 더 나은 효율로 카운드하는 방법이나, 굳이 딕셔너리를 사용하지 않고 좀 더 깔끔하게 피보나치수열을 만들 방법을 고민했고,

코파일럿의 도움으로 아래와 같이 코드를 수정할 수 있었다.

 

a, b = map(int, input().split())
count = 0

fib = [1, 2]
while True:
    next_fib = fib[-1] + fib[-2]
    if next_fib > b:
        break
    fib.append(next_fib)

for num in fib:
    if a <= num <= b:
        count += 1

print(count)

 

lst 리스트를 생성하지 않고, 피보나치수열을 생성하여 if문에서 바로 확인하여 카운트한다.

피보나치 수열을 딕셔너리가 아닌, 리스트에 저장하였다. 불필요한 딕셔너리의 사용을 막을 수 있었다.

 

처음에 비해 훨씬 코드가 간결하고 정돈된 것을 알 수 있다.

 


 

추가)

다른 피보나치 문제를 해결하다가 좀 더 간단한 구현방법을 알게 되어 개선해보았다.

a, b = map(int, input().split())
count = 0
A, B = 1, 2
while True:
    if A in range(a, b+1):
        count += 1
    if B > b:
        break
    A, B = B, A+B
print(count)

 

리스트를 사용할 필요가 없어졌고, 반복문도 하나만 사용하면 된다.