[C언어] 도전! 프로그래밍 1

김민정·2024년 8월 7일
0
post-thumbnail

Chapter 10. 도전! 프로그래밍 1

반복문의 활용 능력과 함수의 정의 능력을 확인해보자.

도전 1

10진수 정수를 입력 받아서 16진수로 출력하는 프로그램을 작성해보자. 이는 서식문자의 활용에 대한 문제이므로 쉽게 해결할 수 있다.

#include <stdio.h>
int main()
{
	int n;
    scanf_s("%d", &n);
    printf("%x", n);
    return 0;
}

> 출력
42
2a

-풀이-
16진수 정수로 나타내는 것은 서식문자 %x를 활용하면 된다.
저기서 a를 대문자 A로 나타내고 싶으면 %X를 사용하면 된다.


도전 2

프로그램 사용자로부터 두 개의 정수를 입력 받아서 구구단을 출력하는 프로그램을 작성해보자.
예를 들어 프로그램 사용자가 3과 5를 입력하면 3단, 4단, 5단이 출력되어야 하고, 2와 4를 입력하면 2단, 3단, 4단이 출력되어야 한다.
단 한가지 조건이 있다. 사용자는 두 개의 숫자를 입력할 때 입력 순서에 자유로워야한다. 3, 5를 입력하던 5, 3을 입력하던 같은 결과를 출력해야 한다.

#include <stdio.h>
void gugudan(int n)  // 구구단 함수.
{	
	printf("<%d단>\n", n);
	for (int i = 1; i < 10; i++)
		printf("%d x %d = %d\n", n, i, n * i);
	printf("\n");
}

int main()  // 구구단 실행.
{
	int dan, n;
	scanf_s("%d %d", &dan, &n);  // 두 개의 수를 입력 받기.
	if (dan < n)  // 대소를 가리지 않고 두 수 사이 구구단 출력을 위해 case를 분류.
	{
		for (dan; dan <= n; dan++)
			gugudan(dan);  // 구구단 함수에 들어가는 숫자가 달라짐.
	}
	else  // 이하 동문.
	{
		for (n; n <= dan; n++)
			gugudan(n);
	}
	return 0;
}

> 출력
5 3
<3>
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

<4>
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36

<5>
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45

-풀이-
gugudan이라는 구구단 함수를 만들어 입력받은 두 수의 대소를 확인해 함수를 실행하는 방법을 사용했다.
구구단 함수에서 출력을 이쁘게 하기 위해 2가지 printf 함수가 사용됐다.


도전 3

두 개의 정수를 입력 받아서 최대 공약수(GCD)를 구하는 프로그램을 작성 해 보자.

<실행의 예>
두 개의 정수 입력: 6 9
두 수의 최대공약수: 3

#include <stdio.h>
int main()
{
	int x, n1, n2, min;
	printf("두 개의 정수를 입력: ");
	scanf_s("%d %d", &n1, &n2);
	
	if (n1 <= n2)	// 두 숫자 대소 차이 없이 동일 한 값 도출 필요.
		min = n1;
	else
		min = n2;

	for (x = min; x >= 1; x--)	// GCP는 둘 중 작은 숫자보다 클 수 없다. 큰 수부터 세기.
	{
		if (n1 % x == 0 && n2 % x == 0)
		{
			printf("최대공약수(GCP): %d", x);
			break;
		}
	}
	return 0;
}

> 출력
두 개의 정수를 입력: 6 9
최대공약수(GCP): 3

-풀이-
두 수를 입력 받아 둘 중 더 작은 값을 min으로 하고 이 수로 나눴을 때 두 수 모두 나머지가 0이 되었을 때 출력했다.
최대 공약수는 두 수의 크기보다 작아야한다는 특징을 이용해 풀었다.


도전 4

3,500원을 가지고 슈퍼에 들려서 크림빵(500원), 새우깡(700원), 콜라(400원)을 사려한다. 잔돈을 하나도 남기지 않고 이 세가지 물건을 하나 이상 반드시 구매하려면 구매 할 수 있는 경우의 수가 어떻게 되는지 출력하는 프로그램을 작성해 보자.
(요즘 물가를 반영하지 않은 문제다.)

<실행의 예>
현재 당신이 소유하고 있는 금액: 3500
크림빵 1개, 새우깡 2개, 콜 라 4개
크림빵 2개, 새우깡 3개, 콜 라 1개
크림빵 4개, 새우깡 1개, 콜 라 2개
어떻게 구입하시겠습니까?

#include <stdio.h>
int main()
{
	int x, y, z;

	printf("현재 당신이 소유하고 있는 금액: 3500\n");
	
	for (x = 1; x <= 7; x++)
		for (y = 1; y <= 5; y++)
			for (z = 1; z <= 8; z++)
				if (x * 500 + y * 700 + z * 400 == 3500)
					printf("크림빵 %d개, 새우깡 %d개, 콜 라 %d개\n", x, y, z);

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

	return 0;
}

> 출력
현재 당신이 소유하고 있는 금액: 3500
크림빵 1, 새우깡 2, 콜 라 4개
크림빵 2, 새우깡 3, 콜 라 1개
크림빵 4, 새우깡 1, 콜 라 2개
어떻게 구입하시겠습니까?

-풀이-
for문을 이용해서 각 미지수가 하나씩 더해갔을 때의 경우를 계산하고 출력하게 했다.


도전 5

10개의 소수(Prime Number)를 출력하는 프로그램을 작성해 보자. 참고로 정수 num이 1과 num으로 밖에 나눠지지 않는다면 이는 소수에 해당한다. 따라서 3은 소수다. 그러나 4는 1, 2, 4로 나눠지기 때문에 소수가 아니다.

<실행의 예>
2 3 5 7 11 13 17 19 23 29

#include <stdio.h>
int main()
{
	int i = 0;
	for (int n = 0; n < 10; n++)  // 10개의 소수 출력.
	{
		i++;

		while (1)  // 기본 반복문.
		{
			int count = 0;  // 소수 갯수 세는 변수.
			for (int x = 1; x <= i; x++)
			{
				if (i % x == 0)
					count++;
			}
			
			if (count == 2)  // 1과 본인이 약수인 수 발견.
			{
				printf("%d ", i);  // 출력하고 while반복문 탈출.
				break;
			}
			else
				i++;  // 이게 없으면 while 반복문 시작이 안됨.
		}
	}
	return 0;
}

> 출력
2 3 5 7 11 13 17 19 23 29

-풀이-
숫자를 카운트 하는 변수 하나 = x,
기준인 숫자 (소수인지 아닌지 알아보기 위한 숫자)를 위한 변수 하나 = i,
약수의 갯수를 세는 변수 하나 = count
를 가지고 약수가 2개이면 소수이기 때문에 해당 숫자를 출력하는 방법을 이용했다.


도전 6

프로그램 사용자로부터 초(second)를 입력 받은 후에, 이를 [시, 분, 초]의 형태로 출력하는 프로그램을 작성해보자.

<실행의 예>
초(second) 입력: 3615
[h:1, m:0, s:15]

#include <stdio.h>
int main()
{
	int n, h = 0, m = 0, s;
	printf("초(second) 입력: ");
	scanf_s("%d", &n);
	
	s = n % 60;
	h = n / 3600;
	m = (n- (h * 3600) - s)/60;
	
	printf("[h:%d, m:%d, s:%d]", h, m, s);
	return 0;
}

> 출력
초(second) 입력: 9609
[h:2, m:40, s:9]

-풀이-
1시간은 3600초, 1분은 60초인 것을 생각해서
우선 60으로 나눈 나머지를 초로,
3600을 나눈 몫을 시간으로,
그리고 그 시간과 초를 이용해 분을 구했다.


도전 7

프로그램 사용자로부터 숫자 n을 입력 받는다. 그리고 나서 다음 공식이 성립하는 k의 최댓값을 계산해서 출력하는 프로그램을 작서해 보자.

2kn2^k ≤ n

<실행의 예>
상수 n 입력: 256
공식을 만족하는 k의 최댓값은 8

#include <stdio.h>
int main()
{
	int n, N = 1;
	printf("상수n 입력: ");
	scanf_s("%d", &n);

	for (int k = 0; N <= n; k++)
	{
		N *= 2;  // k가 2의 지수
		if (N >= n)
		{
			printf("공식을 만족하는 k의 최댓값은 %d", k+1);
			break;
		}
	}
	return 0;
}

> 출력
상수n 입력: 1024
공식을 만족하는 k의 최댓값은 10

-풀이-
2를 계속 곱해보면서 카운트 되는 k를 출력한다. 단 0부터 카운터 하기 때문에 +1 하는 것에 주의해야한다.
+1을 하기 싫으면 애초에 1부터 시작하면 된다 ㅎㅎ


도전 8

2의 n승을 구하는 함수를 재귀적으로 구현해보자.
그리고 그에 따를 적절한 main함수도 구현해보자.

#include <stdio.h>
int mult(int n)
{	
	static int a = 1;
	if (n == 0)
		return a;
	else
	{
		a *= 2;
		mult(n - 1);
	}
}

int main()
{
	int n;
	printf("정수 입력: ");
	scanf_s("%d", &n);

	printf("2의 %d승은 %d\n", n, mult(n));

	return 0;
}

> 출력
정수 입력: 5
25승은 32

-풀이-
mult라는 함수를 만들어 0이 아닌 이상 해당 함수에 2를 곱하면서 숫자를 하나씩 깎으면서 함수르 계속 반환하고 해당 수를 반환하는 것을 했다.
재귀함수를 사용하지 않고 for문을 사용하면 아래 방식처럼 했다.
정수를 입력하면 해당 정수까지 카운트 하면서 2를 곱하는 방법을 사용했다.

#include <stdio.h>
int main()
{
	int n, N = 1;
	printf("정수 입력: ");
	scanf_s("%d", &n);

	for (int k = 1; k <= n; k++)
		N *= 2;

	printf("2의 %d승은 %d\n", n, N);

	return 0;
}

> 출력
정수 입력: 5
25승은 32

<Review>

다시 풀어보다보니 풀이에서 오류를 발견한게 몇개 있어서 좋았다 ㅎㅎ
역시 사람은 다시 뒤를 돌아볼 줄도 알아야한다!

오늘도 알찬 공부 끗-★

profile
백엔드 코린이😁

0개의 댓글

관련 채용 정보