티스토리 뷰
문제 설명
피보나치 수는 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 이하인 자연수입니다.
입출력 예
n return
3 | 2 |
5 | 5 |
입출력 예 설명
피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.
첫번째 풀이는 재귀를 이용하고자 했다.
근데 테스트케이스에서 시간초과...
원인을 찾아보니 재귀가 어느정도 이상 들어가면 진행이 되지 않는다고 한다..
public class Quiz33_시간초과 {
public static void main(String[] args) {
int n = 3;
int answer = 0;
answer = fiboReturn(n);
System.out.println(answer);
}
public static int fiboReturn(int n) {
if (n < 2) {
return n% 1234567;
} else {
return (fiboReturn((n - 2)) + fiboReturn(n - 1)) % 1234567;
}
}
}
일단 피보나치의 수를 구할 수 있는 공식을 문제에서도 알려주고 있고,
심지어 내가 메소드에도 써뒀는데 엄청나게 헤맸다..
여튼 답은,
class Solution {
public int solution(int n) {
int[] fibo = new int[n + 1];
fibo[0] = 0;
fibo[1] = 1;
for (int i = 2; i < fibo.length; i++) {
fibo[i] = (fibo[i - 2] + fibo[i - 1]) %1234567;
}
int answer = fibo[n];
return answer ;
}
}
먼저 배열을 이용했다. 위 코드에서는 주어진 n+1만큼의 길이를 만들고, 시작되는 값인 0,1번째 값들을 미리 지정해 두었다.
그리고 질문하기에 내가 막혔던 부분을 누군가 정말 정성스럽게 작성해 둔 글이 있었다.
https://school.programmers.co.kr/questions/36767
피보나치 수 44만 해도 2,971,215,073로 int의 값을 훨씬 넘은 수라 표현이 안되는 것이다.
그래서 애초에 피보나치 수를 구하는 과정에서 1234567로 나눈 나머지 값을 반환하도록 했다.
그러니까 통과..!
아직 갈 길이 멀다..
문제도 뭔가 얼떨결에 풀고, 우왕좌왕 한다.
'알고리즘 문제' 카테고리의 다른 글
[프로그래머스] 위장 - JAVA (0) | 2023.04.13 |
---|---|
[프로그래머스] 실패율 구하기 (0) | 2023.01.01 |
[프로그래머스] 로또의 최고 순위와 최저 순위 자바 (0) | 2022.12.18 |
[프로그래머스] 배열자르기 (0) | 2022.11.22 |
[프로그래머스] 피자 나눠 먹기(2) (0) | 2022.11.10 |
- Total
- Today
- Yesterday
- CorrectnessAndTheLoopInvariant
- Redis
- index
- 인덱스
- jmeter토큰
- bankersRounding
- jmeter쿠키
- hackerrank
- 프로그래머스
- 동적크롤링
- EC2
- jmeter로그인
- 스프링faker
- Spring
- 항해
- 토큰
- jwt
- jmeter시나리오
- 자바
- jmeter부하테스트
- 대규모더미데이터
- 부하테스트시나리오
- jmeter테스트
- Redisson
- Lock
- CheckedException
- jmeter세션
- Python
- pessimisticlock
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |