본문 바로가기
프로그래밍/Python

[python][BOJ2373] Fibonacci Game

by 김아잉 2023. 2. 12.
728x90

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

 

2373번: Fibonacci Game

당신은 N(2 ≤ N ≤ 1,000,000)개의 구슬을 가지고 다음과 같은 게임을 하려고 한다. 게임은 두 사람이 번갈아 가면서 진행하며, 1번 사람이 몇 개의 구슬을 가져가는 것으로 게임이 시작된다. 1번 사

www.acmicpc.net

 

 

생각이 어렵지 구현은 브론즈 수준이다. 직접 N값과 가져가는 값을 보면 가져갈 수 있는 값들은 늘 피보나치 수와 연관되어 있는 것을 알 수 있다. 이를 코드로 구현할 때 생각해야할 조건은 총 2개가 있다.

  • N이 피보나치 수열의 수일 경우

        - 이 경우에는 무슨 짓을 해도 2번 사람을 이길 수가 없다. 계산할 필요 없이 -1을

          출력해주면 된다.

 

 

  • N보다 작은 피보나치 수열중 가장 큰 값이 아닌 것을 가져가는 경우

        - 설명은 복잡하고 이해도 힘드므로 생략한다. 궁금한 사람은 구글에

           Zeckendorf's theorem을 검색해보길 바란다.

 

 

 

코드는 아래에 있다.

더보기
dp=[0,1]
for i in range(2,75):
    dp.append(dp[i-1]+dp[i-2])

c=int(input())
C=c
for i in range(74,2,-1):
    if c<dp[i]:
        continue
    elif c==dp[i]:
        break
    c-=dp[i]

print(-1 if c==C else c)

 

 

Zeckendorf's theorem 관련 문제에 관심이 있다면 수학 게임도 풀어보길 바란다.

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

 

2862번: 수학 게임

동전의 개수가 4개일 때, 상덕이가 첫 번째 턴에서 가져갈 수 있는 동전의 경우의 수는 1, 2, 3, 4개이다. 만약 4개를 가져가게 된다면 상덕이는 항상 이기게 된다. 하지만, 이것은 최솟값이 아니다.

www.acmicpc.net

 

728x90

댓글