일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
Archives
will come true
[BOJ] 백준 9095번 - 1, 2, 3 더하기 본문
728x90
문제
https://www.acmicpc.net/problem/9095
풀이
- 각 항들의 관계 점화식을 구하기 위해 N이 1~5일 경우를 차례대로 구해본다.
- N을 1, 2, 3의 합으로 표현하는 방법의 수
= N-3을 1, 2, 3의 합으로 표현하는 방법의 수
+ N-2를 1, 2, 3의 합으로 표현하는 방법의 수
+ N-1를 1, 2, 3의 합으로 표현하는 방법의 수 - N-3 값에 3을 한번 더하면 N,
N-2 값에 2를 한번 더하면 N,
N-1 값에 1을 한번 더하면 N이기 때문에 N값은 이 세 값들을 토대로 구할 수 있다. - dp[i] = dp[i-3] + dp[i-2] + dp[i-1]
- dp[1], dp[2], dp[3] 의 경우, dp[0] 값에 영향을 받기 때문에 각각 1, 2, 4로 고정시켜둔다.
- dp[n] 값을 구하기 위해서는 사전에 dp[1]~dp[n-1] 까지의 값이 계산되어야 한다. => DP Bottom-Up 방식
코드
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int testCase = sc.nextInt();
StringBuffer sb = new StringBuffer();
for (int tc = 0; tc < testCase; tc++) {
int n = sc.nextInt();
int[] dp = new int[n + 3]; // n이 1일 경우 대비
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= n; i++) {
dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1];
}
sb.append(dp[n] + "\n");
}
System.out.println(sb);
}
}
★ DP 문제는 역시 익숙한 패턴의 문제가 아닌 이상, 1~5 정도까지의 경우를 직접 손으로 그려보면서 점화식(각 항 사이의 관계)을 파악하는 게 최선인 것 같다.
728x90
'Algorithm' 카테고리의 다른 글
[백준] 2579번 - 계단 오르기 (Java) (0) | 2021.12.18 |
---|---|
[BOJ] 백준 10844번 - 쉬운 계단 수 (0) | 2021.12.15 |
[BOJ] 백준 11727번 - 2 x N 타일링 (2) (0) | 2021.12.14 |
[BOJ] 백준 11726번 - 2 x n 타일링 (0) | 2021.12.14 |
DP - 병사 배치하기 (0) | 2021.12.14 |
Comments