Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- A와 B
- 코딩테스트
- 완주하지 못한 선수
- 프로그래머스
- 124 나라의 숫자
- 백준5710
- 백준16954
- 소수 만들기
- 피보나치 수의 확장
- 움직이는 미로 탈출
- 인구 이동
- 경비원
- 단어 수학
- 부스트캠프
- Smart Commit
- 백준1339
- 빙산
- 전기 요금
- 백준 14499
- 백준
- 백준2573
- 백준3190
- 백준1788
- 로또의 최고 순위와 최저 순위
- 백준 2564
- 백준12904
- 키패드 누르기
- 백준1697
- 백준16234
- 파이썬
Archives
- Today
- Total
Today.dev
[BOJ_1788/Python] 피보나치 수의 확장 본문
문제
수학에서, 피보나치 수는 위의 점화식과 같이 귀납적으로 정의되는 수열이다. 위의 식에서도 알 수 있듯이, 피보나치 수 F(n)은 0 이상의 n에 대해서만 정의된다.
하지만 피보나치 수 F(n)을 n이 음수인 경우로도 확장시킬 수 있다. 위의 식에서 n>1인 경우에만 성립하는 F(n)=F(n-1)+F(n-2)를 n<=1일 때도 성립되도록 정의하는 것이다. 예를 들어 n=1일 때 F(1)=F(0)+F(-1)이 성립되어야 하므로, F(-1)은 1이 되어야 한다.
n이 주어졌을 때, 피보나치 수 F(n)을 구하는 프로그램을 작성하시오. n은 음수로 주어질 수도 있다.
입력
첫째 줄에 n이 주어진다. n은 절댓값이 1,000,000을 넘지 않는 정수이다.
출력
첫째 줄에 F(n)이 양수이면 1, 0이면 0, 음수이면 -1을 출력한다. 둘째 줄에는 F(n)의 절댓값을 출력한다. 이 수가 충분히 커질 수 있으므로, 절댓값을 1,000,000,000으로 나눈 나머지를 출력한다.
풀이
음수 수열이 양수 수열과 부호가 다른 것 말고는 차이가 없다.
양수 수열 : 0, 1, 1, 2, 3, 5, ...
음수 수열 : 0, 1, -1, 2, -3, 5, ...
양수와 음수 동일한 방법으로 dp 테이블을 초기화했고 n이 음수인 경우 양수인지 짝수인지를 검사해서 정답을 출력했다.
# 입력
n = int(input())
# 풀이
if n == 0:
print(0, 0, sep='\n')
exit()
dp = [0 for _ in range(1 + abs(n))]
dp[0], dp[1] = 0, 1
for i in range(2, len(dp)):
dp[i] = (dp[i-1] + dp[i-2]) % 1000000000
# 출력
idx = abs(n)
answer = -dp[idx] if n < 0 and n % 2 == 0 else dp[idx]
print(1 if answer > 0 else -1)
print(abs(answer))
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ_1339/Python] 단어 수학 (0) | 2021.05.31 |
---|---|
[BOJ_16234/Python] 인구 이동 (0) | 2021.05.31 |
[BOJ_2573/Python] 빙산 (0) | 2021.05.31 |
[BOJ_12904/Python] A와 B (0) | 2021.05.25 |
[BOJ_2564/Python] 경비원 (0) | 2021.05.25 |
Comments