https://www.acmicpc.net/problem/15990
15990번: 1, 2, 3 더하기 5
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.
www.acmicpc.net
9095번 1, 2, 3 더하기와 같이 점화식을 쉽게 만들 수 있을 줄 알고.. 몇십분째 이리저리 고민해봐도 안나와서 보니...
2차원으로 해결해야했던 문제..!
다른분들 코드를 참고해서 작성했다
import sys
t = int(sys.stdin.readline())
dp = list([0, 0, 0] * 10001)
# 1, 2, 3으로 끝나는 경우
dp[1] = [1, 0, 0] # 1, X, X
dp[2] = [0, 1, 0] # X, 2, X
dp[3] = [1, 1, 1] # 2+1, 1+2, 3
for i in range(4, 100001):
dp[i][0] = (dp[i-1][1] + dp[i-1][2]) % 1000000009
dp[i][1] = (dp[i-2][0] + dp[i-2][2]) % 1000000009
dp[i][2] = (dp[i-3][0] + dp[i-3][1]) % 1000000009
for _ in range(t):
n = int(sys.stdin.readline())
print(sum(dp[n]) % 1000000009)
그런데 처음에 dp를 2차원으로 만들어야하는데 코드를 잘못작성했다...
for문으로 바로 수정해주었다.
import sys
t = int(sys.stdin.readline())
dp = [[0, 0, 0] for _ in range(100001)]
# 1, 2, 3으로 끝나는 경우
dp[1] = [1, 0, 0] # 1, X, X
dp[2] = [0, 1, 0] # X, 2, X
dp[3] = [1, 1, 1] # 2+1, 1+2, 3
for i in range(4, 100001):
dp[i][0] = (dp[i-1][1] + dp[i-1][2]) % 1000000009
dp[i][1] = (dp[i-2][0] + dp[i-2][2]) % 1000000009
dp[i][2] = (dp[i-3][0] + dp[i-3][1]) % 1000000009
for _ in range(t):
n = int(sys.stdin.readline())
print(sum(dp[n]) % 1000000009)
'공부 > 알고리즘' 카테고리의 다른 글
[알고리즘][백준] 2193번 이친수 - 파이썬(python) 풀이 (0) | 2024.03.07 |
---|---|
[알고리즘][백준] 10844번 쉬운 계단 수 - 파이썬(python) 풀이 (0) | 2024.03.06 |
[알고리즘][백준] 16194번 카드 구매하기 2 - 파이썬(python) 풀이 (0) | 2024.03.05 |
[알고리즘][백준] 9095번 1, 2, 3 더하기 - 파이썬(python) 풀이 (0) | 2024.03.05 |
[알고리즘][백준] 17103번 골드바흐 파티션 - 파이썬(python) 풀이 (0) | 2024.03.05 |