피보나치 수
문제 설명
피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.
예를들어
F(2) = F(0) + F(1) = 0 + 1 = 1
F(3) = F(1) + F(2) = 1 + 1 = 2
F(4) = F(2) + F(3) = 1 + 2 = 3
F(5) = F(3) + F(4) = 2 + 3 = 5
와 같이 이어집니다.
2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.
제한 사항
* n은 1이상, 100000이하인 자연수입니다.
입출력 예
n return
3 2
5 5
입출력 예 설명
피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.
처음 답
1 2 3 4 5 6 7 | def fibonacci(n): if n<=1: return n else: return fibonacci(n-1)%1234567+fibonacci(n-2)%1234567 def solution(n): return fibonacci(n)%1234567 | cs |
재귀를 이용해서 풀었더니 테스트케이스 7부터 13까지 시간 초과, 런타임 에러가 4개씩 발생하였다.
재귀가 메모리도 많이 차지하고 반복문보다 느리기에 시간초과가 발생한 것이다. 런타임 에러는 재귀 호출이 가능한 깊이가 있는데 그것을 초과해서 발생한 것이다.
성공한 내 답
1 2 3 4 5 6 7 8 9 | def solution(n): answer = 0 first = 0 second = 1 for i in range(1,n): answer = first+second first = second%1234567 second = answer%1234567 return answer%1234567 | cs |
문제에서 피보나치 수를 1234567로 나눈 값을 리턴하라고 하는데 이것은 피보나치 수가 int로 표현할 수 있는 범위를 넘기는 상황을 방지한 것이다. 그렇다고 마지막 값만 1234567로 모듈러 연산을 해준다면 이미 int 범위를 넘긴 엉망인 수를 모듈러 연산을 해주는 것이기에 의미가 없는 수이다. (A+B)%C는 (A%C)+(B%C)와 같기 때문에 그 원리를 이용해 각 연산마다 모듈러 연산을 해준다면 정확한 값을 구할 수 있다.
남의 답 1
1 2 3 4 5 | def solution(n): f_list = [0,1] for i in range(2,n+1): f_list.append((f_list[i-2]%1234567+f_list[i-1]%1234567)%1234567) return f_list[-1] | cs |
이 문제는 n이 십만까지의 범위를 갖고 있어서 재귀같은 시간이 많이 걸리거나 깊이가 제한된 방식은 사용될 수 없고 중간에 문제가 개편되어서 다양한 방식의 풀이를 찾을 수는 없었다.
1188점 + 11점 -> 1199점
'Python' 카테고리의 다른 글
| 210710 프로그래머스 코딩 연습 level2 최댓값과 최솟값 (0) | 2021.07.10 |
|---|---|
| 210710 프로그래머스 코딩 연습 level2 올바른 괄호 (0) | 2021.07.10 |
| 210709 프로그래머스 코딩 연습 level2 행렬의 곱셈 (0) | 2021.07.09 |
| 210707 프로그래머스 코딩 연습 완주하지 못한 선수 (0) | 2021.07.07 |
| 210707 프로그래머스 코딩 연습 문자열 내 마음대로 정렬하기 (0) | 2021.07.07 |




최근댓글