반응형
문제
https://www.acmicpc.net/problem/9095
9095번: 1, 2, 3 더하기
문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다. 출력 각
www.acmicpc.net
풀이
1, 2, 3을 이용해서 더한 후 N을 구하는 문제이다. 마지막에 더해지는 숫자에 따라서 N을 구하는 방법을 알 수 있다.
○ + ○ + ○ + ... + ● = N 이라고 할 때, 마지막 ● 에는 1, 2, 3 세 개가 올 수 있다.
따라서 ●는 N - 1, N - 2, N - 3 중에 하나가 되고, 이 세 가지가 되는 방법의 수를 더하면 결국 N까지 더하는 방법의 수가 만들어 진다.
D[N] = N을 1, 2, 3으로 나타내는 경우의 수 라고 하면
D[N] = D[N-1] + D[N-2] + D[N-3] 이 된다.
코드
c++
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
32
33
34
|
#include <iostream>
using namespace std;
int T;
int dp[11];
int result;
int f(int N)
{
if (dp[N]) return dp[N];
return dp[N] = f(N - 1) + f(N - 2) + f(N - 3);
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
cin >> T;
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
int N;
while (T--)
{
cin >> N;
cout << f(N) << '\n';
}
return 0;
}
|
cs |
java
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
|
import java.util.Scanner;
public class Main {
static int t, n;
static Scanner sc = new Scanner(System.in);
static int[] d = new int[11];
public static void main(String[] args) {
t = sc.nextInt();
solve();
for (int i = 0; i < t; i++) {
n = sc.nextInt();
System.out.println(d[n]);
}
}
private static void solve() {
d[1] = 1;
d[2] = 2;
d[3] = 4;
for (int i = 4; i <= 10; i++) {
d[i] = d[i - 1] + d[i - 2] + d[i - 3];
}
}
}
|
cs |
반응형
'BOJ' 카테고리의 다른 글
백준 1759 - 암호 만들기 (0) | 2022.03.02 |
---|---|
백준 - 랜선 자르기 (0) | 2022.02.28 |
백준 2252 - 줄 세우기 (0) | 2022.02.22 |
백준 11725 - 트리의 부모 찾기 (0) | 2022.02.17 |
백준 10816 - 숫자 카드 2 (0) | 2022.02.05 |