n = int(input())
for i in range(n):
case = int(input())
zero = [1, 0, 1]
one = [0, 1, 1]
if case >= 3 :
for i in range(3, case+1):
zero.append(zero[i-2]+zero[i-1])
one.append(one[i-2]+one[i-1])
print(zero[case], one[case])
코드 설명
기본적으로 피보나치 수의 3번째 까지는 0과 1이 등장한 횟수로 초기화하여 준다.
3이상의 숫자가 나올 경우 피보나치의 점화식을 이용하여 zero, one 리스트에 값을 추가하여 준다.
Point : DP 이론을 통하여 빠른 시간내에 구할 수 있는 문제이다. 값을 기억하면서 다음 계산에 이용하는 방식이다.
일단 3번째의 수 까지는 초기화를 통해 default 로 정해두고, 그 이상의 수가 나올 경우 피보나치 수열의 점화식 i-2 + i-1 을 이용하여 0과 1각 리스트를 따로 덧셈을 진행한다.
이렇게 하면 0과 1이 출력되는 횟수는 누적이 되며 정답을 구할 수 있다.
728x90
'SW개발 > 코딩테스트' 카테고리의 다른 글
[백준]1904번 01타일 - DP (0) | 2021.02.06 |
---|---|
[백준]9184번 신나는 함수 실행 - DP (0) | 2021.02.05 |
[백준]13305번 주유소 - 그리디 (0) | 2021.02.03 |
[백준]1449번 수리공 항승 - 그리디 (0) | 2021.02.02 |
[백준]4796번 캠핑 - 그리디 (0) | 2021.02.01 |