문제
정수 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의 합으로 나타내는 방법의 수를 출력한다.
C++ 풀이
#include <iostream>
#include <string>
using namespace std;
int c;
void func(int number) {
if (number == 1)
c++;
else if (number == 2)
c += 2;
else if (number == 3)
c += 4;
else if (number == 4)
c += 7;
else {
func(number - 3);
func(number - 2);
func(number - 1);
}
}
int main() {
int T, n;
cin >> T;
for (int i = 0; i < T; i++) {
c = 0;
cin >> n;
func(n);
cout << c << endl;
}
}
이미 알고 있는 정보 활용
1은 한가지 방법
2는 (1+1, 2) 두가지 방법
3은 (1+1+1, 1+2, 2+1, 3) 네가지 방법
4는 문제 예시와 같이 일곱가지 방법으로 나타낼 수 있다.
1, 2, 3, 4는 이미 방법의 수를 알고 있기 때문에 1, 2, 3, 4만 남도록 계속해서 1 or 2 or 3을 빼준 후 func 함수를 실행한다.
11보다 작은 수를 문제로 주었기 때문에 가능한 풀이인 것 같다. 더 큰 수가 문제로 주어질 경우, 이미 방법의 수를 구한 수에서 1 or 2 or 3을 더해서 푸는 방식이 필요할 것이다.
문제 링크
https://www.acmicpc.net/problem/9095
반응형
'알고리즘 · 코딩' 카테고리의 다른 글
[백준 2798번] 블랙잭 (0) | 2019.08.18 |
---|---|
[프로그래머스] 타일 장식물 (0) | 2019.08.14 |
코딩 테스트 문제 소스 코드 (0) | 2019.08.10 |
[SWEA 1945] 간단한 소인수분해 (0) | 2019.08.10 |
[SWEA 7728] 다양성 측정 (0) | 2019.08.10 |