백준 : 피보나치 함수 - 1003

2025. 10. 15. 01:50·알고리즘
반응형

문제

다음 소스는 N번째 피보나치 수를 구하는 C++ 함수이다.

int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(n‐1) + fibonacci(n‐2);
    }
}

fibonacci(3)을 호출하면 다음과 같은 일이 일어난다.

  • fibonacci(3)은 fibonacci(2)와 fibonacci(1) (첫 번째 호출)을 호출한다.
  • fibonacci(2)는 fibonacci(1) (두 번째 호출)과 fibonacci(0)을 호출한다.
  • 두 번째 호출한 fibonacci(1)은 1을 출력하고 1을 리턴한다.
  • fibonacci(0)은 0을 출력하고, 0을 리턴한다.
  • fibonacci(2)는 fibonacci(1)과 fibonacci(0)의 결과를 얻고, 1을 리턴한다.
  • 첫 번째 호출한 fibonacci(1)은 1을 출력하고, 1을 리턴한다.
  • fibonacci(3)은 fibonacci(2)와 fibonacci(1)의 결과를 얻고, 2를 리턴한다.

1은 2번 출력되고, 0은 1번 출력된다. N이 주어졌을 때, fibonacci(N)을 호출했을 때, 0과 1이 각각 몇 번 출력되는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. N은 40보다 작거나 같은 자연수 또는 0이다.

출력

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.

예제 입력 1 

3
0
1
3

예제 출력 1 

1 0
0 1
1 2

예제 입력 2 

2
6
22

예제 출력 2 

5 8
10946 17711

 

여기서 중요한 것은 피보나치 같은 문제를 재귀로도 해결할 수 있지만 시간 초과가 발생하기 때문에 동적 계획법인 (Dynamic Programming, DP)을 써야 한다.

 


이 코드는 크게 세 부분으로 나눌 수 있다.

  1. 초기값 설정: 계산에 필요한 가장 기본 값(n=0, 1)을 미리 정해두는 부분
  2. DP 테이블 채우기: 반복문을 통해 n=40까지의 모든 결과를 미리 계산해서 저장하는 부분
  3. 입력 및 출력: 사용자 입력을 받아 미리 계산된 결과를 찾아 출력하는 부분

dp[0] = (1, 0): fibonacci(0)을 호출하면 0은 1번, 1은 0번 호출

dp[1] = (0, 1): fibonacci(1)을 호출하면 0은 0번, 1은 1번 호출

 

이것이 규칙의 시작점으로 시작했다.

 

t = int(input())
dp = [(1, 0), (0, 1)]  # fib(0), fib(1) 각각의 (0호출, 1호출)

# 40까지 미리 구해놓기
for i in range(2, 41):
    zero = dp[i-1][0] + dp[i-2][0]
    one = dp[i-1][1] + dp[i-2][1]
    dp.append((zero, one))

for _ in range(t):
    n = int(input())
    print(dp[n][0], dp[n][1])
반응형

'알고리즘' 카테고리의 다른 글

#1 : [코드트리 후기] 코딩테스트 준비, 갭체크부터 시작하기  (0) 2026.05.10
백준 : 소수 구하기 - 1929  (0) 2025.10.15
백준 : FizzBuzz - 28702  (0) 2025.10.10
백준 : FizzBuzz - 14761  (0) 2025.10.10
백준 : 토마토 - 7576  (0) 2025.10.10
'알고리즘' 카테고리의 다른 글
  • #1 : [코드트리 후기] 코딩테스트 준비, 갭체크부터 시작하기
  • 백준 : 소수 구하기 - 1929
  • 백준 : FizzBuzz - 28702
  • 백준 : FizzBuzz - 14761
Feel나는 대로 GI록하는 글
Feel나는 대로 GI록하는 글
세상을 위한 개발자가 되기 위하여
    반응형
  • Feel나는 대로 GI록하는 글
    FeelGI
    Feel나는 대로 GI록하는 글
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • ML & AI (3)
        • 논문 리뷰 (1)
        • Computer Vision (0)
        • Digital Image Processing (1)
      • 알고리즘 (46)
      • 프로그램(대회,공모전,프로그램) (2)
      • 도서 (0)
      • 필기록 (1)
        • 회고록 (0)
        • 끄적끄적 (1)
      • 취업 준비 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    백준 토마토
    LG AI
    동적계획
    14761
    코테
    코딩테스트
    구현 #문자열 #백준 #python
    #코드트리 #코딩테스트 #코테공부 #코테준비 #알고리즘공부 #갭체크
    스택 수열
    ICT 학점연계 프로젝트 인턴십
    알고리즘
    파이썬
    LG Aimers
    28702
    FizzBuzz
    DP #알고리즘 #백준 #Python
    백준
    백준 토마토 7576
    IT대학생
    파이토치
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Feel나는 대로 GI록하는 글
백준 : 피보나치 함수 - 1003
상단으로

티스토리툴바