일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스 옹알이 java
- 백준 14391
- java 반올림
- 코딩테스트
- 0으로 채우기
- mysql
- 백준 16935
- java 올림
- 프로그래머스 연속된 수의 합 java
- 백준 11723
- 네트워크
- 백준 17425
- java
- 백준 15661
- Arrays
- time complexity
- 알고리즘
- Algorithm
- 백준 16927
- Math.ceil()
- 프로그래머스 네트워크 java
- Codility
- java 내림
- 프로그래머스 도둑질 java
- Math.floor()
- 자바
- sort
- 프로그래머스 숫자의 표현 java
- 백준 4375
- 백준 18290
- Today
- Total
취미처럼
[백준] 15990번 1, 2, 3 더하기 5 본문
https://www.acmicpc.net/problem/15990
15990번: 1, 2, 3 더하기 5
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.
www.acmicpc.net
같은 숫자가 2개 연속으로 나오면 안됨
숫자 n을 만들 수 있는 식 중 1로 끝나는 식은 dp[n][1]에, 2로 끝나는 식은 dp[n][2]에, 3으로 끝나는 식은 dp[n][3]에 담는다.
1. 7을 만들 수 있는 수식 중에서
1로 끝나는 수식(마지막에 1을 더해주는 경우) 은
6을 만드는 수식에서 2로 끝나는 것에 1을 더하는 것,
6을 만드는 수식에서 3으로 끝나는 것에 1을 더하는 것
따라서 dp[7][1] = dp[6][2] + dp[6][3] 이다.
점화식 : dp[n][1] = dp[n-1][2] + dp[n-1][3]
2. 7을 만들 수 있는 수식 중에서
2로 끝나는 수식(마지막에 2를 더해주는 경우) 은
5를 만드는 수식에서 1로 끝나는 것에 2를 더하는 것,
5를 만드는 수식에서 3으로 끝나는 것에 2를 더하는 것
따라서 dp[7][2] = dp[5][1] + dp[5][3] 이다.
점화식 : dp[n][2] = dp[n-2][1] + dp[n-2][3]
3. 7을 만들 수 있는 수식 중에서
3으로 끝나는 수식(마지막에 3을 더해주는 경우) 은
4를 만드는 수식에서 1로 끝나는 것에 3을 더하는 것,
4을 만드는 수식에서 2로 끝나는 것에 3을 더하는 것
따라서 dp[7][3] = dp[4][1] + dp[4][2]
점화식 : dp[n[[3] = dp[n-3][1] + dp[n-3][2]
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine());
long[][] dp = new long[100001][4];
dp[1][1] = 1; // 1
dp[1][2] = 0;
dp[1][3] = 0;
dp[2][1] = 0;
dp[2][2] = 1; // 2
dp[2][3] = 0;
dp[3][1] = 1; // 2 + 1
dp[3][2] = 1; // 1 + 2
dp[3][3] = 1; // 3
for(int i = 4; i <= 100000; i++) {
// i-1을 만들 수 있는 숫자 중 맨 끝이 2 or 3인것
dp[i][1] = (dp[i-1][2] + dp[i-1][3]) % 1000000009;
// i-2를 만들 수 있는 숫자 중 맨 끝이 1 or 3인것
dp[i][2] = (dp[i-2][1] + dp[i-2][3]) % 1000000009;
// i-3을 만들 수 있는 숫자 중 맨 끝이 1 or 2인것
dp[i][3] = (dp[i-3][1] + dp[i-3][2]) % 1000000009;
}
for(int j = 0; j < t; j++) {
int n = Integer.parseInt(br.readLine());
long ans = (dp[n][1] + dp[n][2] + dp[n][3]) % 1000000009;
sb.append(ans).append("\n");
}
System.out.println(sb);
}
}
'Algorithm > 백준' 카테고리의 다른 글
[백준] 2193번 이친수 (0) | 2021.03.05 |
---|---|
[백준] 10844번 쉬운 계단 수 (0) | 2021.03.05 |
[백준] 16194번 카드 구매하기 2 (0) | 2021.03.05 |
[백준] 11052번 카드 구매하기 (0) | 2021.03.05 |
[백준] 11727번 2Xn 타일링 2 (0) | 2021.03.05 |