알고리즘/동적 프로그래밍
[BOJ 9095] 1,2,3 더하기 (Java, DP)
leejinwoo1126
2023. 7. 3. 14:07
반응형
문제 링크
https://www.acmicpc.net/problem/9095
9095번: 1, 2, 3 더하기
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
www.acmicpc.net
문제 풀이
- 시간복잡도 O(N)
- DP 상향식 문제
*절차
(1) 가짜 문제 정의
진짜 문제 = 주어진 N에 대해 N을 1,2,3의 합으로 표현하는 경우의 수
가짜 문제 = DP[i] 를 1,2,3으로 표현하는 경우의 수
(2) 가짜 문제를 풀면 진짜 문제를 풀 수 있는가 ? YES
(3) 초기항 정의
0 | 1 | 2 | 3 |
0 | 1 | 2 ( 1 + 1, 2) |
4 - 0에 3을 더할 경우 - 1에 2를 더할 경우 - 2에 1을 더할 경우 |
(4) 점화식 세우기
DP[i] = DP[i - 1] + DP[i - 2] + DP[i - 3]
제출 코드
import java.util.*;
import java.io.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static int T;
static int[] DP;
static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
DP = new int[12];
DP[0] = 0;
DP[1] = 1;
DP[2] = 2;
DP[3] = 4;
for(int i = 4; i <= 11; i++) {
DP[i] = DP[i - 1] + DP[i - 2] + DP[i -3];
}
while(T > 0) {
T -= 1;
int N = Integer.parseInt(br.readLine());
sb.append(DP[N]).append("\n");
}
}
public static void main(String[] args) throws Exception {
input();
System.out.println(sb);
}
}
반응형