imnyang's workspace

뒤로

함수는 무엇인가요?#

수학에서의 함수는 xx를 넣으면 yy가 나오는 것처럼 입력을 하면 출력이 있는 것을 말해요.
프로그래밍에서도 이것은 그렇게 다르지 않아요.
함수를 몰랐어도 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;
} 
c

int를 반환하는 f 함수 선언해요.
f함수는 배열 d에서 가장 큰 값이 처음 나타나는 위치를 찾아서 반환하는 역할을 해요.
f함수에선 아래와 같은 일이 일어나요.

  1. max 변수를 -1로 초기화해요. (배열의 값이 0 이상이기에 -1로 초기화해야해요.)
  2. max_index 변수를 1로 초기화해요.
    • 문제에서 값이 하나만 주어지면 그 값이 가장 큰 값이기에 1로 초기화해야해요.
    • 왜나하면 1부터 시작하거든요.
  3. i가 0부터 n-1까지 반복하는 for 루프를 통해 배열 d의 각 요소를 확인해요.
  4. maxd[i]보다 작은 경우, maxd[i]로 변경하고 max_indexi + 1로 업데이트해요.
    • 문제에서 리턴할 때 배열의 인덱스는 1부터 시작하기 때문에 i + 1로 업데이트해야해요.
  5. max_index를 반환해요.

1535

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의 정수 부분을 뺀 값을 반환하는 것 뿐이에요.

1552

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
  1. 출력하고 싶은 층수 n을 입력받고 f(n)을 호출해요.
  2. f(n)은 바로 별을 찍지 않아요. 현재 실행되는 n값보다 작은 f(n-1)을 계속 호출해요.
  3. 가장 작은 단위인 f(1)부터 실행해요. f(1)g(1)을 호출해요.
    • g(k) 함수도 마찬가지로 g(k-1)을 먼저 호출한 뒤, 돌아오면서 printf("*")를 실행해요. 즉, k번만큼 별을 가로로 출력하게 돼요.
  4. 각 층의 별 출력이 끝나면 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

1859

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;
}
c
  1. f(n)을 호출하면 g(n)이 먼저 실행돼요. g(n)n번 별을 가로로 출력해요.
  2. g(n)이 끝나면 줄바꿈을 하고, f(n-1)을 호출해요. f(n-1)g(n-1)을 호출해서 n-1번 별을 가로로 출력해요.
  3. 이런 식으로 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) return
text

1954

[추가 문제] 1912#

nn이 입력되면 n!n!의 값을 출력하시오.

#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
  1. factorial 함수를 선언해요. n이 1 이하일 때 1을 반환하고, 그렇지 않으면 nfactorial(n-1)의 곱을 반환해요.
  2. main 함수에서 사용자로부터 정수 n을 입력받고 factorial(n)을 호출하여 결과를 출력해요.

1912

[추가 문제] 1920#

어떤 10진수 nn이 주어지면 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;
}
c

10진수를 2진수로 변환하려면 n을 2로 나누면서 나머지들을 역순으로 출력해야해요.

  1. bin 함수는 n이 1보다 큰 경우에만 재귀적으로 bin(n / 2)를 호출해요.
  2. n이 1 이하가 되면 재귀 호출이 종료되고, printf("%d", n % 2)가 실행돼요. 이때 n % 2n을 2로 나눈 나머지를 출력하여 이진수의 각 자리를 나타내요.

1920

골로 간

1532

#include <stdio.h>

long long int f() {
    return -2147483649LL;
}

int main()
{
    printf("%lld", f() );
    return 0;
}
c

1532

1538

#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

1538

1580

#include <stdio.h>

double circle(double r) {
    return r*r*3.14;
}

int main()
{
    int r;
    scanf("%d", &r);
    printf("%.2f", circle(r));
}
c

1580

1852

#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

1852

[Layer7] 2026년 4월 13일 C언어 과제
http://localhost:4321/layer7/03
저자 imnyang
게시일 2026년 04월 14일