코딩테스트
피보나치수 개수 확인문제
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)
리스트를 사용할 필요가 없어졌고, 반복문도 하나만 사용하면 된다.