파이썬 문제풀이/DP

[백준 파이썬] 2749 피보나치 수 3

ari0930 2024. 7. 25. 01:51

[백준 파이썬] 2749 피보나치 수 3 

 

처음에는 이게 무슨 골드 2 문제지 하고

dp=[0,1]
n=int(input())

for i in range(2,n+1):
    dp.append((dp[i-1]+dp[i-2])%1000000)
print(dp[n])

이렇게 코드를 제출했다 결과는 메모리 초과로 실패하여 문제 조건을 확인하였다

입력이 1,000,000,000,000,000,000 작은 n에 대한 피보나치수열인데 메모리 제한이 128MB였다.

문제 답을 출력할 때 1,000,000으로 나눈 나머지를 출력한다라고 적혀있었다.

이걸 보고 난 반복되는 주기가 발생할겠다고 생각하여 

dp=[0,1]
n=int(input())

for i in range(2,4500000+1):
    dp.append((dp[i-1]+dp[i-2])%1000000)
    if ((dp[i-1]+dp[i-2])%1000000==0):
        print(i)

나머지가 0일 때 어떤수인지를 찾는 코드를 만들었다 

750000
1500000
2250000
3000000
3750000
4500000

일때 나머지가 0 이 된다는 걸 확인하여 각 수에서 +1 +2 씩 해가면서 주기를 확인해 보니 1500000 간격으로 수들이 반복되는 것을 확인할 수 있었다.

 

그래서 완성된 코드는 

dp=[0,1]
n=int(input())

for i in range(2,1500000+1):
    dp.append((dp[i-1]+dp[i-2])%1000000)
print(dp[n%1500000])

 

다른 사람들 풀이를 읽어보니 피사노 주기를 나처럼 저렇게 하나하나씩 확인해서 주기는 구하는 게 아니라 공식을 이용해서 확정적으로 주기를 구할 수 있다.

 

주기를 구하는 공식


mod = 1000000
p = mod//10*15

 

반응형

'파이썬 문제풀이 > DP' 카테고리의 다른 글

[백준 파이썬] 2579 계단오르기  (0) 2024.08.09
[백준 파이썬]1106 호텔  (0) 2024.03.19
[백준 2293 파이썬]동전 1 풀이  (1) 2024.02.05