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
- 에라토스테네스의 체
- 튜플
- 알고리즘
- 2017 카카오 코드
- 메뉴리뉴얼
- 순열
- 점프와 순간이동
- 완전 탐색
- 완전탐색
- 후위 표기법
- Stack
- 보이어무어
- pandas
- 반복문
- 쿼드압축 후 개수세기
- 규칙찾기
- 프로그래머스
- 영문자 확인
- 문자열
- python
- dfs
- 어려웠던 문제
- fragment identifier
- 동적계획법
- 조합
- Java
- HashMap
- Dynamic Programming
- 최소공배수
- HashSet
Archives
- Today
- Total
csmoon1010의 SW 블로그
[200904] 피보나치 수 - 연습문제(level2) 본문
1. 문제 이해
- 피보나치 수의 정의
: F(0) = 0, F(1) = 1일 때, F(n) = F(n-1) + F(n-2)가 적용되는 수
ex> 0 1 1 2 3 5 8 13 . . .
- n번째 피보나치 수를 1234567로 나눈 나머지를 리턴
2. 전략
(1) 첫번째 시도 : 재귀함수를 이용
int Fibonacci(n){
if(n == 0) return 0;
else if(n==1) return 1;
else return Fibonacci(n-1) + Fibonacci(n-2);
}
- 문제점 : 불필요한 중복 계산이 들어감(Fibonacci(n-1)을 구할 때 Fibonacci(n-2)를 한 번 더 구함)
→ 시간 초과
(2) 두번째 시도 : int 배열에 0~n번째 피보나치 수를 차례로 저장
- 작은 문제부터 푸는 "상향식 Dynamic Programming"
- 단, 1234567로 나눈 결과이므로 각 피보나치 수를 저장할 때 나눗셈 연산(%) 진행
※ 1234567로 나누는 과정이 필요한 이유
- n이 커질수록 피보나치 수는 급격히 증가 → 데이터 타입의 범위를 벗어남 → 잘못된 결과
- n 이전부터 결과가 잘못될 수도 있으니 각 피보나치수를 구할 때 1234567로 나눠줘야 됨
3. 참고 사항
4. 코드
class Solution {
public int solution(int n) {
int answer = 0;
int[] save = new int[n+1];
save[0] = 0; save[1] = 1;
for(int i = 2; i <n+1; i++){
save[i] = (save[i-2] + save[i-1]) % 1234567;
}
answer = save[n];
return answer;
}
}
'Coding Test > 프로그래머스' 카테고리의 다른 글
[200906] JadenCase 문자열 만들기 - 연습문제(level2) (0) | 2020.09.06 |
---|---|
[200904] 행렬의 곱셈 - 연습문제(level2) (0) | 2020.09.05 |
[200901] 최솟값만들기 - 연습문제(level2) (0) | 2020.09.01 |
[200901] 최댓값과 최솟값 - 연습문제(level2) (0) | 2020.09.01 |
[200831] 폰켓몬 - 찾아라 프로그래밍 마에스터(level2) (0) | 2020.08.31 |
Comments