문제
정수 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보다 작다.
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
입력
3
4
7
10
출력
7
44
274
풀이
완전 탐색 문제... 라고 생각했습니다. 백트래킹 까지는 아니라고 생각이 들었는데 만약 1+1+2와 2+1+1을 구분하는 문제였다면 조건을 걸어줘야하지만 이건 말그대로 전체적으로 한 번 탐색을 하면 되는 문제라고 생각해서 재귀 함수를 만들어서 풀었습니다.
일단 1, 2, 3을 사용해서 푸는 문제이기 때문에 반대로 생각해서 수가 주어지고 그 수를 n이라고 하고 이 n을 이루는 식이 1+1+1+1... 이런식으로 이루어진다면
n = 1+1+1+1+1+...
이걸 왼쪽 항으로 넘겨주면
n-1-1-1-1-1-....= 0
이라는 식이 됩니다. 이걸 보고 '아 그냥 재귀로 풀 탐색을 돌리면 되겠구나' 싶었습니다. 그리곤 0이 되면 멈추고 count를 세어주고 혹시나 0보다 작은 숫자가 나온다면 그건 count를 세지 않도록 했습니다.
3 = 1+2 이기 때문에 3 -1 -2 = 0 이 성립하지만 3 -2 -2 = -1이 되어 성립하지 않습니다. -2가 2개라면 4가 숫자일 때 성립하는 식이기 때문이죠.
이 문제는 처음에 조건만 걸어주면 되는 아주 간단한 문제 였습니다.
코드
#include <iostream>
int count;
void recursive(int n) {
if (n == 0) {
count++;
return;
}
else if (n < 0) {
return;
}
else{
recursive(n - 1);
recursive(n - 2);
recursive(n - 3);
}
}
int main(void) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int a;
scanf("%d", &a);
recursive(a);
printf("%d\n", count);
count = 0;
}
return 0;
}
'공부 > C++' 카테고리의 다른 글
[C/C++] 2xn 타일링 (백준 11726) (0) | 2020.09.07 |
---|---|
[C/C++] 좌표 압축 (백준 18870) (0) | 2020.08.24 |
[C/C++] 숫자 카드 2 (백준 10816) (0) | 2020.08.21 |
[C/C++] 카드2 (백준 2164) (0) | 2020.08.21 |
[C/C++] 랜선 자르기 (백준 1654) (0) | 2020.08.21 |