반응형
1. 문제
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
2. 입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 1,000,000보다 작거나 같다.
3
4
7
10
3. 출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.
7
44
274
4. 코드
import sys
input = sys.stdin.readline
t = int(input())
# 초기값
nums = [1,1,2]
for _ in range(t):
n = int(input())
for m in range(len(nums)-1,n+1):
# 점화식 n = (n-3) + (n-2) + (n-1)
nums.append((nums[-3]+nums[-2]+nums[-1] )%1000000009)
# 결과값 출력
print(nums[n])
5. 풀이설명
① 입력값 t를 입력받는다.
② nums 배열의 초기값을 1,1,2로 생성한다.
③ t만큼 반복문을 실행하여 n을 입력 받는다.
④ nums 배열의 길이 인덱스 부터 n+1 까지 반복문 실행한다.
⑤ nums 배열에 (nums[-3]+nums[-2]+nums[-1])%1000000009을 추가한다.
⑥ 점화식 반복문이 끝나면 nums[n]을 결과값으로 출력한다.
6. 느낀점
점화식 n = (n-3) + (n-2) + (n-1)을 구하여 풀었다. 초반에는 nums 배열을 2차원까지 생성해서 메모리초과가 나오고 두번째는 점화식 계산 반복문 돌릴 때 nums 배열 for 문을 0부터 돌려서 시간 초과가 나왔다 len(nums) 부터 돌리면 결과값이 정상적으로 출력된다.
반응형
'알고리즘 > 문제풀이' 카테고리의 다른 글
DP(1, 2, 3 더하기 4/S1) - 15899 (0) | 2023.03.14 |
---|---|
DP(극장 좌석/S1) - 2301 (0) | 2023.03.11 |
DP(연속합/S2) - 1912 (0) | 2023.03.07 |
DP(퇴사/S3) - 14501 (0) | 2023.03.03 |
DP(계단 오르기 /S3) - 2579 (0) | 2023.03.03 |