함수는 무엇인가요?#
수학에서의 함수는 를 넣으면 가 나오는 것처럼 입력을 하면 출력이 있는 것을 말해요.
프로그래밍에서도 이것은 그렇게 다르지 않아요.
함수를 몰랐어도 C언어에선 우리가 이미 함수를 선언하고 사용하고 있었어요.
main함수도 하나의 함수였고, printf도 <stdio.h>에 선언된 함수였어요.
#include <stdio.h>
int add(int a, int b) { // `add` 함수 선언 (`int`형의 `a`와 `b`를 입력받아 `int`형을 반환하는 함수 `add`를 선언)
return a + b; // `a`와 `b`의 합을 반환
}
int main() { // `main` 함수 선언
printf("Hello, World!"); // `<stdio.h>`에 포함된 `printf` 함수 사용
printf("1 + 2 = %d", add(1, 2)); // `add` 함수 사용
return 0;
}c재귀 함수란 무엇인가요?#
재귀 함수는 자기 자신을 호출하는 함수를 말해요.
재귀 함수는 반복해서 문제를 해결하는 데 사용될 수 있어요.
예를 들어, 팩토리얼을 계산하는 함수를 생각할 수 있어요.
#include <stdio.h>
int factorial(int n) { // `factorial` 함수 선언 (`int`형의 `n`을 입력받아 `int`형을 반환하는 함수 `factorial`을 선언)
if (n <= 1) return 1; // `n`이 1 이하일 때 1을 반환
return n * factorial(n-1); // `n`과 `factorial(n-1)`의 곱을 반환 (재귀 호출)
}
int main() { // `main` 함수 선언
int n; scanf("%d", &n); // 사용자로부터 정수 `n` 입력 받기
printf("%d", factorial(n)); // `factorial` 함수 사용하여 결과 출력
}c우와!! 놀라워요!!#

1535 ↗#
배열에서 가장 큰 값이 처음 나타나는 위치를 출력하시오.
#include <stdio.h>
int n, d[110];
// --------- 위는 코드에서 제공됨 ---------
int f() { // int를 반환하는 `f` 함수 선언
int max = -1; // `max` 변수를 -1로 초기화
int max_index = 1; // `max_index` 변수를 1로 초기화 (문제에서 리턴할떄 배열의 인덱스는 1부터 시작함)
for (int i = 0; i < n; i++) { // `i`가 0부터 `n-1`까지 반복하는 for 루프
if (max < d[i]) { // `max`가 `d[i]`보다 작은 경우
max = d[i]; // `max`를 `d[i]`로 변경
max_index = i + 1; // `max_index`를 `i + 1`로 업데이트 (문제에서 리턴할떄 배열의 인덱스는 1부터 시작함)
}
}
return max_index; // `max_index` 반환
}
// --------- 아래는 코드에서 제공됨 ---------
int main()
{
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf("%d", &d[i]);
printf("%d", f());
return 0;
} cint를 반환하는 f 함수 선언해요.
f함수는 배열 d에서 가장 큰 값이 처음 나타나는 위치를 찾아서 반환하는 역할을 해요.
f함수에선 아래와 같은 일이 일어나요.
max변수를 -1로 초기화해요. (배열의 값이 0 이상이기에 -1로 초기화해야해요.)max_index변수를 1로 초기화해요.- 문제에서 값이 하나만 주어지면 그 값이 가장 큰 값이기에 1로 초기화해야해요.
- 왜나하면 1부터 시작하거든요.
i가 0부터n-1까지 반복하는 for 루프를 통해 배열d의 각 요소를 확인해요.max가d[i]보다 작은 경우,max를d[i]로 변경하고max_index를i + 1로 업데이트해요.- 문제에서 리턴할 때 배열의 인덱스는 1부터 시작하기 때문에
i + 1로 업데이트해야해요.
- 문제에서 리턴할 때 배열의 인덱스는 1부터 시작하기 때문에
max_index를 반환해요.

1552 ↗#
실수(real number)를 입력 받아 소수 부분만 출력하시오.
#include <stdio.h>
double x;
// --------- 위는 코드에서 제공됨 ---------
double f(double t) { // `double`을 리턴하는 `f` 함수 선언 (`double`형의 `t`를 입력받음)
return x-(long long int)t; // `x`에서 `t`의 정수 부분을 뺀 값을 반환 (소수 부분만 남음)
}
// --------- 아래는 코드에서 제공됨 ---------
int main()
{
scanf("%lf", &x);
printf("%.14lf\n", f(x));
}c간단해요. 그저 f 함수는 x에서 t의 정수 부분을 뺀 값을 반환하는 것 뿐이에요.

1859 ↗#
정수 n을 입력받아 n층의 별 삼각형을 출력하시오.
#include <stdio.h>
int n;
void g(int k)
{
if(k <= 0) return; // `k`가 0 이하일 때 함수 종료
g(k-1); // `g` 함수를 `k-1`로 재귀 호출 (재귀적으로 층을 하나씩 줄여가며 호출)
printf("*"); // 별을 출력하여 현재 층의 별을 나타냄
}
void f(int k) // `f` 함수 선언 (`int`형의 `k`를 입력받음)
{
if(k <= 0) return; // `k`가 0 이하일 때 함수 종료
f(k-1); // `f` 함수를 `k-1`로 재귀 호출 (재귀적으로 층을 하나씩 줄여가며 호출)
g(k); // `g` 함수를 `k`로 호출 (현재 층의 별을 출력)
printf("\n"); // 줄바꿈을 출력하여 다음 줄로 이동
}
int main()
{
scanf("%d", &n); // 사용자로부터 정수 `n` 입력 받기
f(n); // `f` 함수 호출
}c- 출력하고 싶은 층수
n을 입력받고f(n)을 호출해요. f(n)은 바로 별을 찍지 않아요. 현재 실행되는n값보다 작은f(n-1)을 계속 호출해요.- 가장 작은 단위인
f(1)부터 실행해요.f(1)은g(1)을 호출해요.g(k)함수도 마찬가지로g(k-1)을 먼저 호출한 뒤, 돌아오면서printf("*")를 실행해요. 즉, k번만큼 별을 가로로 출력하게 돼요.
- 각 층의 별 출력이 끝나면
printf("\n")으로 줄을 바꿔요.
n = 3
f(3)
-> f(2)
-> f(1)
-> f(0) return
-> g(1)
-> g(0) return
-> print "*"
-> print "\n"
-> g(2)
-> g(1)
-> g(0) return
-> print "*"
-> print "*"
-> print "\n"
-> g(3)
-> g(2)
-> g(1)
-> g(0) return
-> print "*"
-> print "*"
-> print "*"
-> print "\n"text
1954 ↗#
길이 n이 입력되면 역삼각형을 출력한다.
#include <stdio.h>
int n;
void g(int k)
{
if(k <= 0) return;
printf("*");
g(k-1);
}
void f(int k)
{
if(k <= 0) return;
g(k);
printf("\n");
f(k-1);
}
int main()
{
if (scanf("%d", &n) == 1) {
f(n);
}
return 0;
}cf(n)을 호출하면g(n)이 먼저 실행돼요.g(n)은n번 별을 가로로 출력해요.g(n)이 끝나면 줄바꿈을 하고,f(n-1)을 호출해요.f(n-1)은g(n-1)을 호출해서n-1번 별을 가로로 출력해요.- 이런 식으로
f(n)이f(n-1),f(n-2), …f(1)을 호출하면서 별의 개수가 하나씩 줄어드는 역삼각형이 출력돼요.
n = 3
f(3)
-> g(3)
-> print "*"
-> g(2)
-> print "*"
-> g(1)
-> print "*"
-> g(0) return
-> print "\n"
-> f(2)
-> g(2)
-> print "*"
-> g(1)
-> print "*"
-> g(0) return
-> print "\n"
-> f(1)
-> g(1)
-> print "*"
-> g(0) return
-> print "\n"
-> f(0) returntext
[추가 문제] 1912 ↗#
이 입력되면 의 값을 출력하시오.
#include <stdio.h>
int factorial(int n) { // `factorial` 함수 선언 (`int`형의 `n`을 입력받아 `int`형을 반환하는 함수 `factorial`을 선언)
if (n <= 1) return 1; // `n`이 1 이하일 때 1을 반환
return n * factorial(n-1); // `n`과 `factorial(n-1)`의 곱을 반환 (재귀 호출)
}
int main() { // `main` 함수 선언
int n; scanf("%d", &n); // 사용자로부터 정수 `n` 입력 받기
printf("%d", factorial(n)); // `factorial` 함수 사용하여 결과 출력
}c- factorial 함수를 선언해요.
n이 1 이하일 때 1을 반환하고, 그렇지 않으면n과factorial(n-1)의 곱을 반환해요. main함수에서 사용자로부터 정수n을 입력받고factorial(n)을 호출하여 결과를 출력해요.

[추가 문제] 1920 ↗#
어떤 10진수 이 주어지면 2진수로 변환해서 출력하시오.
#include <stdio.h>
void bin(int n) { // `bin` 함수 선언 (`int`형의 `n`을 입력받음)
if (n > 1) { // `n`이 1보다 큰 경우
bin(n / 2); // `bin` 함수를 `n / 2`로 재귀 호출 (재귀적으로 `n`을 2로 나누어가며 호출)
}
printf("%d", n % 2); // `n`을 2로 나눈 나머지를 출력하여 이진수의 각 자리를 나타냄 (재귀 호출이 끝난 후에 출력)
}
int main() {
int n;
scanf("%d", &n); // 사용자로부터 정수 `n` 입력 받음
bin(n); // `bin` 함수 호출하여 `n`의 이진수 표현 출력
return 0;
}c10진수를 2진수로 변환하려면 n을 2로 나누면서 나머지들을 역순으로 출력해야해요.
bin함수는n이 1보다 큰 경우에만 재귀적으로bin(n / 2)를 호출해요.n이 1 이하가 되면 재귀 호출이 종료되고,printf("%d", n % 2)가 실행돼요. 이때n % 2는n을 2로 나눈 나머지를 출력하여 이진수의 각 자리를 나타내요.

골로 간
#include <stdio.h>
long long int f() {
return -2147483649LL;
}
int main()
{
printf("%lld", f() );
return 0;
}c
#include <stdio.h>
int n;
int f(int n) {
if (n%2 == 0) {
printf("even");
} else {
printf("odd");
}
}
int main()
{
scanf("%d", &n);
f(n);
return 0;
}c
#include <stdio.h>
double circle(double r) {
return r*r*3.14;
}
int main()
{
int r;
scanf("%d", &r);
printf("%.2f", circle(r));
}c
#include <stdio.h>
int wow(int n; int r) {
if (r == n) {
return 0;
} else {
printf("%d", n);
return wow(n, n-1);
}
}
int main() {
int n;
scanf("%d", &n);
wow(n);
}c