백준 9095 - 1, 2, 3 더하기
Updated:
C++
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의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
문제 출처
접근 방법
입력 되는 수를 [1,2,3]의 합을 구하되, 중복을 허용하므로 [1,2,3]을 각각 더하는 DFS를 호출하며 목표 수에 도달하면 총 횟수를 1 증가한다.
중복을 허용한다는 것은, 1+2+1 과 1+1+2는 다른것으로 생각한다는 것이다.
목표 수보다 더 커지는 것을 탈출 조건으로 DFS를 종료한다.
구현
현재까지 총 합과 목표 수를 DFS의 매개변수로 설정하여, 현재 총 합 수 sum
에 1,2,3 각각 더하면서 새로운 DFS를 호출한다.
DFS가 종료 되면, 현재까지 얻은 총 방법의 수를 호출하며 초기화 하여 새로운 목표 수가 설정 된 DFS를 호출한다.
코드
#include <iostream>
#include <vector>
using namespace std;
int n, result;
void DFS(int, int);
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
int inputN;
while (n--) { // n개의 입력을 받는다.
cin >> inputN;
DFS(0, inputN);
cout << result << "\n"; //위 DFS의 결과인 총 방법의 수를 출력하고 0으로 초기화한다.
result = 0;
}
return 0;
}
void DFS(int sum, int targetN) {
if (sum > targetN) // 목표 숫자보다 크면 종료
return;
else if(sum == targetN){ // 목표 숫자에 도달하면
result++;
return;
}
DFS(sum + 1, targetN);
DFS(sum + 2, targetN);
DFS(sum + 3, targetN);
}
총평
난이도
⭐★★★★
후기
간단한 DFS라 쉽게 해결 가능하였다.
개선할 점
차후 DP로도 연습해야 할 문제이다.