C Programming/윤성우의 열혈 C 프로그래밍

Chapter 10 도전! 프로그래밍 1(문제 풀이)

All리얼 개발자 2025. 4. 9. 06:00

 

               ※ 해당 코드의 문제는 올리지 않았으니 책을 참고해 주시기 바랍니다.

          

               ※ 도전 문제들은 가능하면 직접 풀어보시기 바랍니다. 

 

 

도전 문제 1.

#include <stdio.h>

 

int main(void)

{

    int num;

    printf("10진수 정수 입력: ");

    scanf("%d", &num);

 

    printf("16진수로 출력: %x\n", num);

}

 

설명:

문제 그대로 10진수 정수를 입력하면 16진수 정수로 변환하면 해결된다.

= %x 사용

 

 

도전 문제 2.

#include <stdio.h>

 

void multi(int num1, int num2)

{

    int i;

 

    while(num1<=num2)

    {

        for(i=1; i<10; i++)

        {

            printf("%d X %d = %d\n", num1, i, num1*i);

        }

        printf("\n");

        num1++;

    }

}

 

int main(void)

{

    int a, b;

 

    printf("정수 두개 입력: ");

    scanf("%d %d", &a, &b);

 

    if(a<b)

    {

        multi(a, b);

    }

    else

    {

        multi(b, a);

    }

 

    return 0;

    }

 

설명:

두 정수의 사이의 구구단을 출력하기 위한 multi 함수 구현.

1)   입력받을 첫 번째 인자 num1:  while(num1<=num2)

2)   for문을 통해서 곱할 단: for(i=1; i<10; i++)

3)   두 번째 인자 num2와 값이 동일할 때까지 num1++ 증가.

 

main 함수 구현

1)   입력할 정수 num1 num2에 저장

2)  문제에서 명시한 조건을 만족하기 위해 if:

num1<num2의 경우, multi(num1, num2)의 결과값 반환

반대의 경우, multi(num2, num1) 결과값 반환

 

 

도전 문제 3

#include <stdio.h>

 

int GCD(int num1, int num2)

{

    int result;

 

    result = (num1<num2) ? num1 : num2;

    while(num1%result != 0 || num2%result !=0)

    {

        result--;

    }

 

    return result;

}

 

int main(void)

{

    int a, b;

 

    printf(" 개의 정수 입력: ");

    scanf("%d %d", &a, &b);

 

    printf("최대공약수 출력: %d\n", GCD(a, b));

 

    return 0;

}

 

설명:

최대공약수 GCD의 원리를 파악하고 있으면 쉽게 해결할 수 있는 문제.

 

함수 GCD 구현

1)   변수 result에 전달할 인자 중 가장 작은 값 저장.

result = (num1<num2) ? num1 : num2;

 

2)   while문을 통해 나누어 떨어지지 않으면 반복하고 약수의 최댓값을 구하기 위해 0으로 나누어 떨어지지 않는 동안 result-- 로 값을 줄임.

 

 

도전 문제 4.

#include <stdio.h>

 

const int bread = 500;

const int shrimp = 700;

const int cola = 400;

 

int main(void)

{

    int money, a, b, c;

 

    printf("현재 당신이 소유하고 있는 금액: ");

    scanf("%d", &money);

 

    for(a=1; a<money/bread; a++)

    {

        for(b=1; b<money/shrimp; b++)

        {

            for(c=1; c<money/cola; c++)

            {

                if(money==(bread*a+shrimp*b+cola*c))

                {

                    printf("크림빵 %d, ", a);

                    printf("새우깡 %d, ", b);

                    printf("콜라 %d\n", c);

                }

            }

        }

    }

    printf("어떻게 구입하시겠습니까? \n");

 

    return 0;

}

 

설명:

입력한 금액을 남기지 않고 위 세 가지 물건을 무조건 각각 하나 이상 구매해야 하는 경우의 수를 구현.

 

1)   각 물건마다 for문 작성.

최소의 1개 구매일 때, 입력한 금액/물건의 금액이 1개보다 많아야 한다.

2)   입력한 money 값과 구매한 물건의 금액이 동일한 if문 작성

조건문을 만족하는 경우, , 구매하는 물건의 전체 금액과 보유한 금액이 동일한 경우 -> 각 물건의 구매 가능한 개수의 경우의 수 출력.

 

 

도전 문제 5.

#include <stdio.h>

 

int IsPrime(int n)

{

    int i;

    int result = 0;

 

    for(i=1; i<=n; i++)

    {

        if(n%i == 0)

        {

        result++;

        }

    }

 

    if(result == 2)

    {

        return 1;

    }

    return 0;

}

 

int main(void)

{

    int num = 2;

    int inc = 0;

 

    while(inc<10)

    {

        if(IsPrime(num) == 1)

        {

            printf("%d ", num);

            inc++;

        }

        num++;

    }

    return 0;

}

 

설명:

IsPrime 함수 구현 → 전달받은 인자 n이 소수인지 판별하는 목적.

1)   for(i=1; i<=n; i++)

정수 n보다 작은 정수로 나눌 때 나누어 떨어지는지 검사하고 나누어 떨어지는 정수는 약수의 개수 증가.

2)   if(result == 2)

약수의 개수가 두 개, , 본인과 1(소수)일 때, 1 반환.

 

Main 함수 구현

1)   while(cnt<10)

10개의 소수를 출력하기 위한 조건. 그리고 num의 초기값 2부터 증가.

2)   if(IsPrime(num) == 1)

인자 입력 전달 시, 1을 반환하면 num값 출력. 10개 출력하기 위해서 cnt++ 증가.

 

 

도전 문제 6.

#include <stdio.h>

 

const int H = 3600;

const int M = 60;

 

int main(void)

{

    int time, h, m, s;

 

    printf("(second) 입력: ");

    scanf("%d", &time);

 

    h = time/H;

    time = time%H;

 

    m = time/M;

    time = time%M;

 

    s= time;

 

    printf("[h:%d, m:%d, s:%d] \n", h, m, s);

   

    return 0;  

}

 

설명:

이 문제는 함수 구현 없이 바로 main 함수 안에서 쉽게 구현가능.

 

1)   const int H = 3600; const int M = 60;

1시간 = 3600, 1 = 60(전역변수 선언)

2)   h = time/H;

입력받은 초(second) 3600으로 나눈 값을 h변수에 저장. , 이값이 hour(시간).

3)   time = time%H;

입력받은 초(second)의 나머지를 구하면 분을 구할 수 있음.

Ex: 3616%3600 = 16.

 

 

도전 문제 7.

#include <stdio.h>

 

int main(void)

{

    int n, k;

    int inc =1;

 

    printf("상수 n 입력: ");

    scanf("%d", &n);

 

    if(n==0)

    {

        return 1;

    }

 

    for(k=0; inc*2<=n; k++)

    {

        inc = inc*2;

    }

 

    printf("공식을 만족하는 k 최댓값은? %d\n", k);

 

    return 0;

}

 

설명:

1)   if(n==0)

n=0일 때 프로그램 종료를 시킨다.

2)   for(k=0; inc*2<=n; k++)

초기값 1 inc를 선언하고 이것을 이용해서 k값이 0에서 증가할 때마다증가 => 2, 4, 8…

 

 

도전 문제 8.

#include <stdio.h>

 

int multi(int n)

{

    if(n==0)

    {

        return 1;

    }

 

    return multi(n-1)*2;

}

 

int main(void)

{

    int num;

 

    printf("정수 입력: ");

    scanf("%d", &num);

 

    printf("2 %d승은? %d\n", num, multi(num));

 

    return 0;

}

 

설명:

재귀함수의 개념만 이해하면 쉽게 해결할 수 있다.

 

multi 함수 구현

1)   if(n==0)

2의0 제곱인 경우1 반환하게 한다. 그래야 재귀함수의 종료조건이 성립됨.

2)   return multi(n-1)*2;

n=0이 될 때까지 계속해서 2를 곱해 나간다.