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

 

1003번: 피보나치 함수

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

www.acmicpc.net

 


간단한 문제인거 같은데 꽤 고민을 오래한거같다. 핵심은 동적 계획법을 활용한다는거다.

다른 블로그에 많이들 올라온 방법은 도저히 이해가 안되어서 나혼자만의 방법으로 푼거 같다

찾아보니 꽤나 많이 알려진 방법이다. 아이디어는 단순하다.

dp[0][n] = n번째 수열의 0의 개수

dp[1][n] = n번째 수열의 1의 개수

 

fib(2) = fib(1) + fib(0)

fib(3) = fib(2) + fib(1) 

        = fib(0) + fib(1) + fib(1)

fib(4) = fib(3) + fib(2)

         = fib(0) + fib(1) + fib(1) + fib(1) + fib(0)

그냥 단순하게 해당 수열의 전 수열의 개수를 세는것이 끝이다.



fi = [[0]*41 for _ in range(2)]

for i in range(2,41):

     fi[0][0]=fi[1][1]=1
     fi[0][1]=fi[1][0]=0
     fi[0][i] = fi[0][i-1]+fi[0][i-2]
     fi[1][i] = fi[1][i-1]+fi[1][i-2]
     
for _ in range(int(input())):
     n = int(input())
     print(fi[0][n],fi[1][n])

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

2981 - 파이썬  (0) 2022.05.05
9184 - 파이썬  (0) 2022.05.03
14889 - 파이썬  (0) 2022.05.02
14888 - 파이썬  (0) 2022.05.01
15650 - 파이썬  (0) 2022.04.05

+ Recent posts