프로그래머스 피보나치 수 JAVA 풀이 (DP, 공간 최적화)

2026. 6. 22. 16:00·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제 개요

피보나치 수열은 다음과 같은 규칙을 가진다.

n번째 피보나치 수를 구한 뒤, 1234567로 나눈 나머지를 반환하는 문제이다.

F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2)

📌 접근 방법

처음에는 DP 배열을 사용하여 모든 피보나치 값을 저장할 수 있다.

arr[i] = arr[i - 1] + arr[i - 2];

하지만 현재 값을 계산할 때 필요한 것은 직전 두 개의 값뿐이다.

따라서 배열 대신 두 개의 변수만 사용하여 공간을 절약할 수 있다.

또한 피보나치 수는 매우 빠르게 증가하므로 매 계산마다 1234567로 나눈 나머지를 저장한다.


📌 핵심 아이디어

1. 이전 두 값만 저장

피보나치 수열은 직전 두 값만 필요하므로 배열을 사용할 필요가 없다.

int prev2 = 0;
int prev1 = 1;

2. 다음 피보나치 수 계산

현재 값을 계산하면서 동시에 나머지 연산을 수행한다.

answer = (prev1 + prev2) % 1234567;

3. 값 이동

다음 계산을 위해 이전 값들을 한 칸씩 이동시킨다.

prev2 = prev1;
prev1 = answer;

예시

0, 1 → 1
1, 1 → 2
1, 2 → 3
2, 3 → 5

4. 나머지 연산을 미리 수행하는 이유

피보나치 수는 매우 빠르게 증가한다.

따라서 큰 n에서는 자료형 범위를 초과할 수 있다.

모듈러 연산의 성질을 이용하면

F(50) = 12,586,269,025
이므로 매 단계마다 나머지 연산을 수행해도 최종 결과는 동일하다.
(a + b) % M
=
((a % M) + (b % M)) % M

📌 전체 코드

class Solution {
    public int solution(int n) {
        int answer = 0;
        int prev2 = 0;
        int prev1 = 1;

        for (int i = 2; i <= n; i++) {
            answer = (prev1 + prev2) % 1234567;
            prev2 = prev1;
            prev1 = answer;
        }

        return answer;
    }
}
 

📄 정리

  • 피보나치 수열은 이전 두 값만으로 계산할 수 있다.
  • 배열 대신 변수 두 개를 사용하여 공간복잡도를 줄였다.
  • 매 계산마다 1234567로 나눈 나머지를 저장하여 오버플로우를 방지했다.
  • DP 문제에서도 필요한 값만 유지하면 메모리를 크게 절약할 수 있다.
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

프로그래머스 숫자의 표현 JAVA 풀이 (투 포인터, 슬라이딩 윈도우)  (0) 2026.06.23
프로그래머스 다음 큰 숫자 JAVA 풀이 (비트 연산, Integer.bitCount)  (0) 2026.06.23
프로그래머스 올바른 괄호 JAVA 풀이 (스택)  (0) 2026.06.22
프로그래머스 최솟값 만들기 JAVA 풀이 (그리디, 정렬)  (0) 2026.06.21
프로그래머스 JadenCase 문자열 만들기 JAVA 풀이 (문자열, 구현)  (0) 2026.06.20
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 숫자의 표현 JAVA 풀이 (투 포인터, 슬라이딩 윈도우)
  • 프로그래머스 다음 큰 숫자 JAVA 풀이 (비트 연산, Integer.bitCount)
  • 프로그래머스 올바른 괄호 JAVA 풀이 (스택)
  • 프로그래머스 최솟값 만들기 JAVA 풀이 (그리디, 정렬)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN N
      • 코테(Solved.ac + Programmers) N
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    정렬
    level0
    실기
    피보나치
    정처기
    java
    정보처리기사 실기 기출문제
    solved.ac
    완전탐색
    수학
    springboot
    백준
    정처기실기
    백엔드개발자
    코딩테스트
    정보처리기사
    자료구조
    배열
    dp
    자바
    구현
    정처기오답노트
    브루트포스
    시뮬레이션
    기출문제
    level1
    프로그래머스
    Level2
    문자열
    알고리즘
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 피보나치 수 JAVA 풀이 (DP, 공간 최적화)
상단으로

티스토리툴바