ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1788. [Python]피보나치 수의 확장
    Python_알고리즘/Silver III 2023. 4. 19. 01:43

    1. 문제

     

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

     

    1788번: 피보나치 수의 확장

    첫째 줄에 F(n)이 양수이면 1, 0이면 0, 음수이면 -1을 출력한다. 둘째 줄에는 F(n)의 절댓값을 출력한다. 이 수가 충분히 커질 수 있으므로, 절댓값을 1,000,000,000으로 나눈 나머지를 출력한다.

    www.acmicpc.net

     

    2. 접근 방법

     

    • 시간 제한: 2초
    • 메모리 제한: 128MB
    • 다이나믹 프로그래밍

     

    3. 파이썬 코드

     

    def fibonacci(num):
        # 양수일때 피보나치 리스트
        dp = [0, 1]
        # 음수일 경우 피보나치 리스트
        dp_ma = [0, 1, -1]
        # 음수에서 절대값 구하기 위해서 사용되는 변수
        check = 0
        # n 값이 1000000을 넘지 않는다 했으므로 범위를 미리 설정하여 값을 다 구해둔다
        for _ in range(2,1000001):
            # 양수인 경우 기존의 피보나치 구하는 방식대로 구한다.
            answer_dp = dp[-1] + dp[-2]
            # 음수의 경우 기존에서 구하는 방식과는 다르게 -2 값에서 -1을 빼는 식으로 값을 구한다.
            answer_ma = dp_ma[-2]-dp_ma[-1]
            # 양수의 경우 그냥 나머지를 나눠서 값으로 넣어준다.
            answer_dp %= 1000000000
            # 만약 결과값이 음수인 경우 check 라는 변수에 1을 넣어주고 answer_ma에 -를 붙여서 양수로 변경해준다.
            if answer_ma < 0:
                answer_ma = -answer_ma
                check = 1
            # 똑같이 1000000000을 나눠준다
            answer_ma %= 1000000000
            # 만약 앞에서 check를 통해서 음수에서 양수로 변경되었다면 다시 음수로 바꿔준 후 check를 다시 0으로 바꾼다.
            if check == 1:
                answer_ma = -answer_ma
                check = 0
            dp.append(answer_dp)
            dp_ma.append(answer_ma)
        # 들어온 input 값에 따라서 반환해주는 리스트를 다르게 해준다.
        if num < 0:
            return dp_ma[abs(num)]
        else:
            return dp[num]
    
    num = int(input())
    ans = fibonacci(num)
    # 반한된 결과값에 따라서 음수면 -1 양수면 1 0이면 0을 출력해준다.
    if ans < 0:
        print(-1)
        print(abs(ans))
    elif ans > 0:
        print(1)
        print(ans)
    else:
        print(0)
        print(ans)

     

    4. 문제를 풀고난 후 생각

     

    • 문제를 보고 그냥 피보나치 수열을 구하면 되는게 아닌가? 라는 생각을먼저 했다. 그래서 기존의 피보나치 수열을 구현했고 input 으로 들어온 값이 음수인지 0인지 양수인지 등을 판단해서 첫째 값을 출력해 주었다.
    • 틀리고 나서 문제를 보고 다시 생각을 했고, 음수로 들어온 input 값의 경우 피보나치 수열을 계산을 따로 해줘야 하고 그 인덱스 번호의 값이 양수인지 음수인지 0 인지를 판단해서 답을 출력하는 문제였다는 것을 깨달았다.
    • 음의 피보나치를 어떻게 구현할지 고민을 했고, 기존의 더해가는 방식이 아닌 -2 인덱스에서 -1 인덱스를 빼주는 식으로 값을 추가해 나갔으며 출력을 구현하는 부분에서 음수이면 check 라는 변수를 통해서 -에서 +로 변해준 것을 체크해주며 값을 갱신해주었다.

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 다이나믹 프로그래밍

    'Python_알고리즘 > Silver III' 카테고리의 다른 글

    1431. [Python]시리얼 번호  (0) 2023.04.23
    1213. [Python]팰린드롬 만들기  (0) 2023.04.22
    1515. [Python]수 이어 쓰기  (0) 2023.04.14
    14425. [Python]문자열 집합  (0) 2023.03.01
    2108. [Python]통계학  (0) 2023.02.25

    댓글

Designed by Tistory.