백준
[백준] 9905 1, 2, 3 더하기 (JAVA)
sami355
2022. 3. 6. 17:25
https://www.acmicpc.net/problem/9095
9095번: 1, 2, 3 더하기
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
www.acmicpc.net
풀이
위의 문제는 기본적인 dp문제이다. 우선 접근법은 간단하다. 우리는 어떠한 수 x가 들어온다고 하였을경우 x-1, x-2, x-3을 한다. 그 이후 각각의 수가 만약 이전에 계산하여 구했던 적이 있다면 그대로 dp배열에 있는 값을 반환해준다. 예를 들어 4를 x라고 하였을 경우 우리는 3 + 1, 2 + 2, 1 +3을 하여 경우의 수를 구하게 된다. 이때 각각의 연산값을 자세히 보면 3 + 1의 경우는 1, 2, 3만으로 3을 만들었는 경우에서 1을 각각 더하면 4가 되기에 우리는 dp[3]이 3 + 1 이라는 연산의 결과값임을 알수있게 된다. 이의 연장선상으로 2 + 2를 한다면 1, 2 ,3을 통해 2를만드는 경우에 각각 2를 더하면 되기에 이는 즉 dp[2] + 2가 된다. 이렇게 하여 변수 x가 들어올경우 x-1, x-2, x-3의 경우를 차례차례 더하면 된다. 자세한것은 코드를 보면 이해가 될것이다.
코드
import java.io.*;
class Main {
public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static int[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int t;
dp = new int[12];
dp[0] = 1;
for (int i = 0; i < n; i++) {
t = Integer.parseInt(br.readLine());
bw.write(calc(t) + "\n");
}
bw.flush();
bw.close();
}
public static int calc(int x) {
if (dp[x] != 0) {
return dp[x];
} else {
for (int i = 1; i <= 3; i++) {
if (x - i >= 0) {
dp[x] = dp[x] + calc(x - i);
}
}
return dp[x];
}
}
}