Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘
- Python
- 면접질문
- Algorithm
- C
- 파이썬
- BFS
- 코딩테스트
- 쿠쉬쿠쉬
- BruteForceSearch
- 프로그래머스
- Java
- 이분그래프판별
- 운영체제
- 그래프
- 문제풀이
- 코테준비
- OS
- 코딩테스트준비
- 동적계획법
- Lv.1
- 해시
- 고득점Kit
- hash
- LV.3
- C++
- Lv.2
- 2색칠하기
- 단지번호붙이기
Archives
- Today
- Total
쿠쿠의기록
8. division 본문
문제
임의의 자연수는 그보다 작은 자연수들의 합으로 표현될 수 있다. 예를 들어 4의 경우,
4
= 3+1
= 2+2
= 2+1+1
= 1+1+1+1
위와 같은 방법으로 표현 될 수 있다. 이 때 , 숫자의 구성이 같으면서 그 순서만이 다른 경우는 같은 경우로 생각하는데, 예를 들어 다음 세 가지 경우는 모두 같은 경우이다.
2 + 1 + 1, 1 + 2 + 1 , 1 + 1 + 2
자연수 n을 입력 받아 이를 n보다 작은 자연수들의 합으로 나타내는 방법을 모두 출력하는 프로그램을 재귀 호출을 사용하여 작성하시오.
입력
첫 줄에 2 이상 20 이하의 자연수 n이 주어진다.
출력
첫째 줄부터 모든 방법을 한 줄에 하나씩 출력한다. 하나의 식 안에는 큰 숫자가 앞으로 오도록 하고, 전체적으로는 앞의 숫자가 큰 식이 먼저 출력되도록 한다. 숫자와 더하기 사이에는 공백이 없다. 그리고 마지막 줄에는 나누어진 자연수의 개수를 출력한다.
예제 입력
5
예제 출력
4+1
3+2
3+1+1
2+2+1
2+1+1+1
1+1+1+1+1
6
문제풀이
#include <stdio.h>
int n;
int cnt = 0;
int arr[50];
void getResult(int x,int d){
if(x>=n){
cnt++;
printf("%d",arr[0]);
for(int i = 1; i<d; i++){
printf("+%d",arr[i]);
}
printf("\n");
return;
}
else{
int num;
if(x==0){
num = n-1;
}else{
num = n-x;
}
for(int i = num; i>=1; i--){
arr[d] = i;
if(d>0 && arr[d-1] < arr[d]) continue;
getResult(x+i,d+1);
}
}
}
int main(){
scanf("%d",&n);
getResult(0,0);
printf("%d",cnt);
return 0;
}
'알고리즘 > L7~8 재귀함수' 카테고리의 다른 글
8. inequal (0) | 2020.09.08 |
---|---|
8. dessert (0) | 2020.09.08 |
8. tobin (0) | 2020.09.08 |
8. 순열구하기 (0) | 2020.09.07 |
7. mountain (0) | 2020.08.24 |