https://www.acmicpc.net/problem/1003
1003번: 피보나치 함수
각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.
www.acmicpc.net
1. 해결방법
"""
1. 아이디어
- 피보나치 수열을 이용해서 1이 출력된 횟수와 0이 출력된 횟수를 카운트 한다.
- 카운트 된 횟수를 배열에 append해서 print
2. 시간복잡도
- O(40N) == O(N)
"""
처음에 zero는 1,0로 나열되고 one은 0,1로 나열된다.
그 이후의 n번째부터는 피보나치 수열(N2 = N1 + N0)로 나열된다.
그렇다면 이제, 규칙을 가지고 구현해보자.
- 0과 1의 초기배열을 먼저 만들어준다.
- 0은 [1,0] 1은 [0,1] 로 정해져있음.
- for문으로 초기배열 이후 피보나치 수열로 구한 값을 배열에 추가해준다.
- 각 테스트케이스마다 0과 1의 횟수를 공백으로 출력해야한다.
2. 정답코드
import sys
input = sys.stdin.readline
N = int(input())
def fibo(num):
for i in range(2, num + 1):
zero.append(zero[i - 1] + zero[i - 2])
one.append(one[i - 1] + one[i - 2])
print(zero[num], one[num])
for i in range(N):
num = int(input())
zero, one = [1, 0], [0, 1]
fibo(num)
DP가 익숙하지 않은 사람이라면 해결하는데 좀 고민했을 것이다. 본인처럼,,,
그래도 못풀 문제는 아니니까 DP문제에 대한 이해와 피보나치 수열에 대한 이해만 조금 있으면 풀 수 있는 문제이다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 1197. 최소 스패닝 트리 (0) | 2022.09.07 |
---|---|
[BOJ] 2579. 계단 오르기 (0) | 2022.09.07 |
[BOJ] 9095. 1, 2, 3 더하기 (0) | 2022.09.06 |
[BOJ] 11726. 2×n 타일링 (0) | 2022.09.06 |
[BOJ] 1339. 단어 수학 (0) | 2022.09.06 |