이 영역을 누르면 첫 페이지로 이동
포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

페이지 맨 위로 올라가기

포렌식 & 개발 이야기 - Forensics & Development

Pental - Forensics / iOS / Windows / Android / Kakaotalk / Telegram / Etc

[골드 2] 백준 2749 - 피보나치 수 3 (파이썬)

  • 2025.07.04 14:09
  • Programming/백준
글 작성자: pental

https://www.acmicpc.net/problem/2749

풀이

이미지 출처 : https://velog.io/@cha-suyeon/python-피보나치-수열-만들기-점프투파이썬-종합문제-5번

피보나치 수열은 위 그림 처럼 제일 초기 1에서 1을 더한 값이 2, 2와 1을 더한 값이 3, …, n - 1번째 값과 n을 더한값.. 이런식으로 계속해서 늘어나는 수열이다.

결국 식을 작성하면 다음과 같다.

Fn = Fn-1 + Fn-2 (n >= 2)

이런식으로 n 이 17일때의 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 문제이다.

여기서 한가지 고려해야할 점은 시간 제한이 1초라는 것이다. 일반적인 제귀 방식으로는 시간초과가 날것이 뻔하다.

그래서 사용하는 것은 피사노 주기이다. (Pisano Period)

피사노 주기는 피보나치 수열을 어떤 수 M으로 나눈 나머지를 구할 때, 그 나머지들에서는 주기성이 생긴다.

여기서 주기성은 반복되는 패턴을 말한다. 이 반복되는 주기를 피사노 주기하고 한다.

예를 들어서 MOD = 3 일때 피사노주기는 다음과 같다.

N fibo(N) fibo(n) % 3
0 0 0
1 1 1
2 1 1
3 2 2
4 3 0
5 5 2
6 8 2
7 13 1
8 21 0
9 34 1
10 55 1
… … …

이 나머지들의 패턴은 어느 순간부터 다시 반복된다. 그래서 이 반복되는 길이가 피사노 주기이다.

핵심적으로 fibo(n) % M은 fibo(n % 주기) % M과 같다.

이걸 잘 활용하면, 엄청나게 큰 n도 주기만큼 줄여서 계산 할 수 있다.

이 문제에서는 MOD는 1,000,000이므로 피사노 주기는 1,500,000이다.

따라서 fibo(N) % 1000000 = fibo(n % 1500000) % 1000000 이다.

fibo = [0] * (n + 2)  # 0부터 n까지 계산하기 위해 n+2만큼 공간
fibo[1] = 1           # 초기값 설정 (fib(0) = 0, fib(1) = 1)

for i in range(2, n + 1):
    fibo[i] = (fibo[i - 1] + fibo[i - 2]) % MOD  # 매번 MOD로 나머지만 저장

피보나치 수열을 반복문으로 구하는 코드이다.

이 과정은 단순한 반복문으로 피보나치 수를 누적하는 방식이다. n이 최대 1500000이므로, 시간이랑 메모리에 매우 효율적이다.

시간복잡도 분석

  1. 시간 : O(Pisano) = O(1,500,000)
  2. 공간 : O(Pisano) = 배열 하나만 사용

공간을 줄이는 방법을 생각하면 다음과 같다.

공간도 줄이고 싶다면 fibo[] 배열 없이 변수 2개로도 충분히 수정 할 수 있다.

a, b = 0, 1
for _ in range(n):
    a, b = b, (a + b) % MOD
print(a)

이건 공간 복잡도 O(1) 짜리 최적화 버전이다.

코드

# 백준 2749 - 피보나치 수 3

N = int(input())
MOD = 1000000

# # 시간초과 (1. 제귀 방식)
# def fibo(n : int) :
#     if n == 1 or n == 2 :
#         return 1
#     else :
#         return fibo(n - 1) + fibo(n - 2)

# print(fibo(N) % MOD)

# # 시간초과 (2. 이전값 + 전전값 더하는 방식)
# def fibo(n) :
#     a = 1
#     b = 1
#     if n == 1 or n == 2 :
#         return 1
#     for i in range(1, n) :
#         a, b = b, b + a
    
#     return a

# print(fibo(N) % MOD)

n = N % 1500000
fibo = [0] * (n + 2)
fibo[1] = 1

for i in range(2, n + 1) :
    fibo[i] = (fibo[i - 1] + fibo[i - 2]) % MOD

print(fibo[n])
저작자표시 비영리 (새창열림)

'Programming > 백준' 카테고리의 다른 글

[골드 3] 백준 12784 - 인하니카 공화국 (파이썬)  (1) 2025.07.04
[플래티넘 5] 백준 20188 - 등산 마니아 (파이썬)  (0) 2025.07.03
[실버 2] 백준 17213 - 과일 서리 (파이썬)  (0) 2025.07.03
[골드 2] 백준 1655 - 가운데를 말해요 (파이썬)  (0) 2025.07.02
[골드 4] 백준 1327 - 소트 게임 (파이썬)  (0) 2025.07.02

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [골드 3] 백준 12784 - 인하니카 공화국 (파이썬)

    [골드 3] 백준 12784 - 인하니카 공화국 (파이썬)

    2025.07.04
  • [플래티넘 5] 백준 20188 - 등산 마니아 (파이썬)

    [플래티넘 5] 백준 20188 - 등산 마니아 (파이썬)

    2025.07.03
  • [실버 2] 백준 17213 - 과일 서리 (파이썬)

    [실버 2] 백준 17213 - 과일 서리 (파이썬)

    2025.07.03
  • [골드 2] 백준 1655 - 가운데를 말해요 (파이썬)

    [골드 2] 백준 1655 - 가운데를 말해요 (파이썬)

    2025.07.02
다른 글 더 둘러보기

정보

포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

  • 포렌식 & 개발 이야기 - Forensics & Development의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

카테고리

  • Category (476) N
    • Forensics (19)
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (25)
      • DFC (7)
      • 디지털포렌식전문가2급 자격증 (10)
      • FTK ACE 자격증 (7)
    • 이것저것 (7)
      • Ubuntu (6)
      • 디스코드 봇 (4)
      • Volatility GUI (2)
    • CTF (32)
      • NEWSECU (14)
      • CTF-d (5)
      • Puzzel - Network Forensics (2)
      • Security Traps (2)
      • system32.kr (5)
      • HMCTF (4)
    • Programming (284) N
      • C (10)
      • Python (11)
      • 백준 (230) N
      • 프로그래머스 (32)
    • 그냥 개발 및 잡담 (16)
      • Docker (2)
      • Google Cloud (3)
      • OS 개발 (3)
    • Best of Best (20)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • axiom
  • 파이썬
  • Forensics
  • 디지털포렌식
  • 프로그래머스
  • pental
  • 포렌식
  • 백준
  • 전체 보기…

정보

pental의 포렌식 & 개발 이야기 - Forensics & Development

포렌식 & 개발 이야기 - Forensics & Development

pental

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © pental.

티스토리툴바