반응형
문제는 여기서!
https://school.programmers.co.kr/learn/courses/30/lessons/12945
문제설명
더보기
피보나치 수는 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은 2 이상 100,000 이하인 자연수입니다.
입출력 예
nreturn3 | 2 |
5 | 5 |
입출력 예 설명
피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.
문제가 잘 안풀린다면😢
힌트가 필요한가요? [코딩테스트 연습 힌트 모음집]으로 오세요! → 클릭
문제해결 keyPoint
- 피보나치 수열의 값을 구한다.
- 구해진 피보나치 수열에 1234567을 나누는 부분으로 나눈다.
- n번째 수열의 값은 n-2,n-1번째 수열의 값을 더한 값이다.
- 경계 값으로 테스트 해보면 알겠지만, int형으로는 오버플로우가 일어난다.
20220919 1차시도
더보기
음.. 뭐지?... 시간초과 하는 부분도 있을거라고 생각했는데, 의외로 그냥 구해졌다.
이걸 DFS? BFS로도 구할 수 있을까??
시간초과?? 를 생각하면 더 구할 수 있는 방법이 있을까??
import java.math.*;
class Solution {
public int solution(int n) {
/**
* 1. 피보나치 수열의 값을 구한다.
* 2. 구해진 수열의 값에 1234567을 나눈 나머지를 반환한다.
* 3. n번째 수열은 n-1,n-2 번째 수열의 값을 더한 값이다.
* 4. for문으로 0부터 모든 값을 계산하면 값을 구할 수 있다.
* 5. int, long형으로도 수열 계산이 범위를 벗어난다.
*/
int answer = 0;
//피보나치 수열을 구한다.
BigDecimal number = this.getNumber(n);
//구해진 수열의 값에서 나머지를 구한다.
answer = this.getResult(number).intValue();
return answer;
}
public BigDecimal getNumber(int n){
/**
* TODO: 피보나치 수열은 어떻게 구할수 있을까?..
* 단순한 for문으로는 long형으로도 오버플로우가 난다.. BigDecimal??
*/
//피보나치 수열
BigDecimal[] fArr = new BigDecimal[n+1];
fArr[0] = BigDecimal.ZERO;
fArr[1] = BigDecimal.ONE;
// 나이브하게 for문으로 구해보기
for(int i=2; i<=n; i++){
fArr[i] = fArr[i-2].add(fArr[i-1]);
}
return fArr[n];
}
public BigDecimal getResult(BigDecimal number){
return number.remainder(new BigDecimal(1234567));
}
}
반응형
'알고리즘' 카테고리의 다른 글
프로그래머스[87946] - 피로도(lv2) - 미완 (0) | 2022.09.28 |
---|---|
프로그래머스[12981] - 영어 끝말잇기(lv2) (0) | 2022.09.26 |
프로그래머스[17677] - 뉴스 클러스터링(lv2) (0) | 2022.09.16 |
프로그래머스[1292] - 숫자의 표현 (lv2) (0) | 2022.09.15 |
프로그래머스[43165] - 타겟 넘버(lv2) (0) | 2022.09.14 |