/*
재귀함수 : 자신으로 다시 돌아오는 함수
: 함수 내에서 자신을 다시 호출하는 함수
: 자신으로 다시 정의내리는 함수
1. 재귀 함수 만들기 연습
2. 재귀함수 적용해서 쓰기 (피보나치, 등등)
void f(int n)
{
for(int i=n;i>=1;i--)
printf("%d ",i);
}
f(n) : n부터 1까지 출력
: n출력 n-1출력 ... 2출력 1출력
: n출력 -> n-1부터 1까지 출력
: n출력 -> f(n-1)
n>=1
종료조건 if(n==0)
#include <stdio.h>
void f(int n)
{
if(n==0) return ;
printf("%d ",n);
f(n-1);
}
2. 1부터 n까지 출력
3. a부터 b까지 출력
4. a부터 b까지 홀수만 출력
*/
/*#include <stdio.h>
void f(int n)
{
if(n==0) return ;
f(n-1);
printf("%d ",n);
}
int main()
{
int n;
scanf("%d",&n);
f(n);
}
#include <stdio.h>
void f(int a, int b)
{
if(a>b) return ;
f(a,b-1);
printf("%d ",b);
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
f(a,b);
}
#include <stdio.h>
void f(int a, int b)
{
if(a>b) return ;
f(a,b-1);
if(b&2!=0) printf("%d ",b);
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
f(a,b);
}
5. 1부터 n까지의 합 리턴
f(n) : n부터 1까지 합 리턴
: n+ n-1+ ... +2+ 1 리턴
: n+( n-1부터 1까지합 ) 리턴
: n+ f(n-1) 리턴
종료조건 if(n==1) 리턴 1
6. 1부터 n까지의 곱 리턴
#include <stdio.h>
int f(int n)
{
if(n==1) return 1;
return n*f(n-1);
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",f(n));
return 0;
}
피보나치 수열
f(n) : n번째 피보나치수 리턴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 1 2 3 5 8 13 21 34 65 109 174 283 457 740 1197 1937
memoization
#include <stdio.h>
int memo[200]={};
int f(int n)
{
if(memo[n]!=0) return memo[n];
if(n<=2) return memo[n]=1;
return memo[n]=(f(n-1)+f(n-2))%10009;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",f(n));
return 0;
}
1. 2진수 변환
2. 각자릿수의합
3. supersum (memo)
#include <stdio.h>
int memo[15][15]={};
int SS(int k,int n)
{
if(memo[k][n]!=0) return memo[k][n];
if(k==0) return n;
if(n==0) return 0;
return memo[k][n]=SS(k,n-1)+SS(k-1,n);
}
int main()
{
int k,n;
while(scanf("%d %d",&k,&n)!=EOF)
{
printf("%d\n",SS(k,n));
}
return 0;
}
#include <stdio.h>
void t(int n)
{
if(n==0) return ;
t(n/2);
printf("%d",n%2);
}
int main()
{
int n;
scanf("%d",&n);
if(n==0) printf("0");
else t(n);
}
#include <stdio.h>
int sum(long long int n)
{
if(n==0) return 0;
return sum(n/10)+n%10;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",sum(n));
return 0;
}
아시아정보올림피아드
구조체 struct
학생 100명의 나이와 성적(a,b,c,d..) 관리
#include <stdio.h>
typedef struct
{
int age;
char grade;
}student;
int main()
{
student arr[100];
for(int i=0;i<100;i++)
{
scanf("%d %c",&arr[i].age,&arr[i].grade);
}
// i번째학생과 i+10번째 학생의 정보를 교환
// int temp;
// temp=age[i];
// age[i]=age[i+10];
// age[i+10]=temp;
//
// char ctemp;
// ctemp=grade[i];
student temp;
temp=arr[i];
arr[i]=arr[i+10];
arr[i+10]=temp;
// int age[100];
// char grade[100];
}
1 - 재귀 + 재귀메모이제이션 + 구조체설명약간
2 - 정렬 (버블, 선택, 삽입)
3 - 구조체 + 구조체정렬
4 - 퀵정렬 + 이분 탐색
- 탐색 (이진탐색, or DFS,BFS)
HW 재귀 카테고리 문제 다풀기
*/
#include <stdio.h>
typedef struct
{
int count;
int num;
int score;
}student;
int main()
{
int N;
student arr[101]={};
scanf("%d",&N);
for(int i=0;i<N;i++)
{
scanf("%d %d %d",&arr[i].count,&arr[i].num,&arr[i].score);
}
int max1=0,max2=0,max3=0;
int count1=0, count2=0, count3=0;
int num1=0, num2=0, num3=0;
for(int i=0;i<N;i++)
{
if(max1<arr[i].score)
{
max1=arr[i].score;
num1=arr[i].num;
count1=arr[i].count;
}
}
for(int i=0;i<N;i++)
{
if(max2<arr[i].score && arr[i].score<max1)
{
max2=arr[i].score;
num2=arr[i].num;
count2=arr[i].count;
}
}
for(int i=0;i<N;i++)
{
if(max3<arr[i].score && arr[i].score<max2)
{
max3=arr[i].score;
num3=arr[i].num;
count3=arr[i].count;
}
}
printf("%d %d\n",count1,num1);
printf("%d %d\n",count2,num2);
printf("%d %d\n",count3,num3);
return 0;
}