본문 바로가기
C언어/Do it! 개념 정리

#1-1. 기본 알고리즘

by 가으더 2021. 12. 28.
728x90

01-1 알고리즘이란?

 

이 장에서는 알고리즘의 개념을 설명하기 위해 간단한 최대값 찾기 문제를 보여주고 있다.

최대값 찾기는 대부분할 수 있기 때문에, 바로 알고리즘의 개념을 설명하자면 다음과 같다.

 

알고리즘이란

 : 문제를 해결하기 위한 것으로, 명확하게 정의되고 순서가 있는 유한 개의 규칙으로 이루어진 집합

 

연습문제 Q1: 네 값의 최대값을 구하는 함수 max4를 작성하세요.

인자가 적다면 반복문보다는 하나씩 비교하는 것이 더 빠를 것 같아 반복문을 쓰지 않고 풀어보았다.

#include <stdio.h>

int max4(int a, int b, int c, int d) {
	int func_max = a;

	if (func_max < b) {
		func_max = b;
	}
	if (func_max < c) {
		func_max = c;
	}
	if (func_max < d) {
		func_max = d;
	}
	
	return func_max;
	
}
int main(void) {
	int main_max = max4(1, 2, 3, 4);

	printf("%d\n", main_max);
}

 

연습문제 Q2: 세 값의 최솟값을 구하는 함수 min3를 작성하세요.

연습문제 Q3: 네 값의 최솟값을 구하는 함수 min4를 작성하세요.

Q2, Q3도 Q1의 함수처럼 그대로 사용하면 구할 수 있기 때문에 넘기도록 하겠다.

 

연습문제 Q4: 세 값의 대소관계 13종류의 모든 조합에 대해 중앙값을 구하여 출려갛는 프로그램을 작성하세요.

중앙값을 구하는게 최대, 최소값보다 조금 더 복잡하다. 코드는 아래와 같다.

#include <stdio.h>

int med3(int a, int b, int c)
{
	if (a >= b)
		if (b >= c)
			return b;
		else if (a <= c)
			return a;
		else
			return c;
	else if (a > c)
		return a;
	else if (b > c)
		return c;
	else
		return b;
}

int main(void)
{
	printf("med3 (%d %d %d) = %d입니다.\n", 3, 2, 1, med3(3, 2, 1));  /* [A] a > b > c */
	printf("med3 (%d %d %d) = %d입니다.\n", 3, 2, 2, med3(3, 2, 2));  /* [B] a > b = c */
	printf("med3 (%d %d %d) = %d입니다.\n", 3, 1, 2, med3(3, 1, 2));  /* [C] a > c > b */
	printf("med3 (%d %d %d) = %d입니다.\n", 3, 2, 3, med3(3, 2, 3));  /* [D] a = c > b */
	printf("med3 (%d %d %d) = %d입니다.\n", 2, 1, 3, med3(2, 1, 3));  /* [E] c > a > b */
	printf("med3 (%d %d %d) = %d입니다.\n", 3, 3, 2, med3(3, 3, 2));  /* [F] a = b > c */
	printf("med3 (%d %d %d) = %d입니다.\n", 3, 3, 3, med3(3, 3, 3));  /* [G] a = b = c */
	printf("med3 (%d %d %d) = %d입니다.\n", 2, 2, 3, med3(2, 2, 3));  /* [H] c > a = b */
	printf("med3 (%d %d %d) = %d입니다.\n", 2, 3, 1, med3(2, 3, 1));  /* [I] b > a > c */
	printf("med3 (%d %d %d) = %d입니다.\n", 2, 3, 2, med3(2, 3, 2));  /* [J] b > a = c */
	printf("med3 (%d %d %d) = %d입니다.\n", 1, 3, 2, med3(1, 3, 2));  /* [K] b > c > a */
	printf("med3 (%d %d %d) = %d입니다.\n", 2, 3, 3, med3(2, 3, 3));  /* [L] b = c > a */
	printf("med3 (%d %d %d) = %d입니다.\n", 1, 2, 3, med3(1, 2, 3));  /* [M] c > b > a */

	return 0;
}

 

연습문제 Q5: 아래 그림의 코드가 Q4의 함수보다 효율이 떨어지는 이유는?

int med3(int a, int b, int c)
{
	if ((b >= a && c <= a) || (b <= a && c >= a))
		return a;
	else if ((a > b && c < b) || (a < b && c > b))
		return b;
	return c;
}

해설

if ((b >= a && c <= a) || (b <= a && c >= a) 설명
여기서 (b >= a 및 b <= a)의 판단을 거꾸로 뒤집은 판단이 다음 else 이후에 else if ((a > b && c < b) || (a < b && c > b)라는 식으로 이어집니다. 첫 번째 if가 성립하지 않는 경우 두 번째 if에서도 같은 판단을 하므로 이 알고리즘은 효율적이지는 않습니다.

 

나의 생각

효율적이라는 것은 최대한 계산이 최소화한다는 것이다. 

Q4의 함수는 아무리 많이 거쳐도 4번이지만, Q5의 함수는 대소비교와 논리연산자의 계산까지 더하면 8번이므로 Q5의 함수가 비효율적이라는 것을 알 수 있다.

 

 

'C언어 > Do it! 개념 정리' 카테고리의 다른 글

#2-1. 기본 자료구조 - 배열(소수의 나열)  (0) 2022.02.20
#2-1. 기본 자료구조 - 배열 (1)  (0) 2022.01.08
#1-2. 반복  (0) 2021.12.31
#0. 시작  (0) 2021.12.28