본문 바로가기
JAVA/Coding Test Study

[Lv.2] 피보나치 수 : Java

by ♡˖GYURI˖♡ 2024. 3. 20.
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

이해하기

피보나치 수? 분명 풀어봤었는데? 하고 만만히 봤다가 꽤나 오래 걸렸던 문제ㅠ

 

첫번째 아이디어는 재귀로 풀이하기였다.

class Solution {
    public int solution(int n) {
        int answer = fibonacci(n) % 1234567;

        return answer;
    }

    public int fibonacci(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }

        return fibonacci(n - 2) + fibonacci(n - 1);
    }
}

 

테스트 케이스는 잘 돌아가길래 통과할 줄 알았는데 7번부터 줄줄이 시간 초과...

그러고보니 피보나치 수 문제를 풀 때 재귀를 사용하면 매번 계산해야해서 시간이 오래 걸린다고 들었던 기억이 났다.

 

그래서 생각한 두번째 아이디어는 이전 계산값을 list에 저장하고 바로바로 불러오기였다.

import java.util.*;

class Solution {
    List<Integer> list = new ArrayList<>();

    public int solution(int n) {
        int answer = 0;

        list.add(0);
        list.add(1);
        list.add(1);

        if (n == 0) {
            return 0;
        } else if (n == 1 || n == 2) {
            return 1;
        } else {
            fibonacci(n);
            answer = list.get(n);
        }

        return answer % 1234567;
    }

    public void fibonacci(int n) {
        int idx = list.size() - 1;
        while (idx != n) {
            list.add(list.get(idx - 1) + list.get(idx));
            idx++;
        }
    }
}

 

이 코드 또한 6번까지는 잘~ 통과되다가 7번부터 실패, 실패, 실패...

아까는 풀이는 제대로였지만 시간초과가 문제였다면, 지금건 계산 로직에서 실패가 뜬 것 같다고 추정했다.

 

결국 다른 분의 글을 참고한 후 다시 풀었다...

 

 

문제풀이

 

[프로그래머스] 피보나치 수 (Java)

🔗 문제 링크 https://programmers.co.kr/learn/courses/30/lessons/12945

velog.io

참고했던 블로그 글!

미리 계산해서 저장해둔 후 불러온다는 아이디어는 비슷했지만 배열을 사용하셨다는 점과 1234567로 나머지 계산을 미리 한 후 저장하셨던 점이 차이점인 것 같다.

아마 두번째 풀이에서 실패가 떴던 게 나머지 연산을 미리 해주지 않아서일 것 같다는 생각이 든다.

 

class Solution {
    public int solution(int n) {
        int answer = fibonacci(n);
        return answer;
    }

    public int fibonacci(int n) {
        int[] fibo = new int[n + 1];
        fibo[0] = 0;
        fibo[1] = 1;

        for (int i = 2; i <= n; i++) {
            fibo[i] = (fibo[i - 2] + fibo[i - 1]) % 1234567;
        }

        return fibo[n];
    }
}

 

그치만 분명 재귀 파트 문제였는데 이런 풀이는 재귀 형식이 아니지 않나 싶었다ㅜ

 

 

'JAVA > Coding Test Study' 카테고리의 다른 글

[Lv.2] 무인도 여행 : Java  (0) 2024.03.20
[Lv.2] 게임 맵 최단거리 : Java  (0) 2024.03.20
[Lv.2] 하노이의 탑 : Java  (0) 2024.03.19
[Lv.2] 모음사전 : Java  (0) 2024.03.19
[Lv.1] 대충 만든 자판 : Java  (0) 2024.03.04