알고리즘 : 최대를 구하는 문제

지환·2022년 2월 5일
0

알고리즘

목록 보기
6/12
post-thumbnail

세 값의 최댓값을 구해라.

<코드

#include <stdio.h>

int main(void)
//문제는 세 정수를 받고 그 중에서 최대값을 구하는 문제다.
{
	int a, b, c;
	int max;
	printf("세 수를 입력하세요 : ");
	scanf_s("%d", &a);
	scanf_s("%d", &b);
	scanf_s("%d", &c);
	max = a;
	if (b > max) max = b; 
	if (c > max)  max = c;
	printf("%d", max);

}
  • 코드는 순차적 구조를 띄고, 이와 같은 방법으로 진행된다.
  1. max에 a 값을 넣는다.
  2. b값이 max보다 크면 max에 b 값을 넣는다.
  3. c값이 max보다 크면 max에 c 값을 넣는다.

<결과>

<세 값의 중앙 값을 구해라>

int Mid(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()
{
	int a, b, c;
	printf("세 정수의 중앙값을 구하세요. : \n");
	printf("a의 값 :"); scanf_s("%d", &a);
	printf("b의 값 :"); scanf_s("%d", &b);
	printf("c의 값 :"); scanf_s("%d", &c);

	printf("%d", Mid(a, b, c));

}
  • 어차피 수가 같다고 가정하더라도, 수는 나열될 수 밖에 없다. a와 b가 같다고 가정해도 어차피 중앙값만 돌려받기 때문에 a b c 나 b a c인 경우 중앙값은 같다. 이럴 경우 나올수 있는 경우의 수는 여섯가지가 된다.
  1. (a>=b) c의 자리 이동으로 경우의 수를 나눌 수 있다.
    1-1.a-b-c
    1-2.a-c-b
    1-3.c-a-b
  2. (b>a)
    2-1)b-a-c
    2-2)b-c-a
    2-3)c-b-a

반복 숙달해야되는 문제다. 결정 트리를 이용한 대표적인 예제였지만 필수적으로 알아야 된다.

중앙 값을 구하는 예제를 다른 방법으로도 구현이 가능하다.

<중앙값 예제2>

int Mid(int a, int b, int c)
{
	if ((b >= a && c <= a) || (b <= a && c >= a)) // b-a-c || c-a-b
		return a;
	else if ((a > b && c < b) || (a < b && c > b)) // a-b-c || c-b-a
		return b;
	return c; // 그게 아니라면 c

}
int main()
{
	int a, b, c;
	printf("세 정수의 중앙값을 구하세요. : \n");
	printf("a의 값 :"); scanf_s("%d", &a);
	printf("b의 값 :"); scanf_s("%d", &b);
	printf("c의 값 :"); scanf_s("%d", &c);

	printf("%d", Mid(a, b, c));

}

결과는 동일하게 나온다. 차이점이 무엇일까? 밑 예제는 같은 연산을 반복하기 때문에 비효율적이다. (1번 조건을 분석 후 -> 2번 분석)

profile
아는만큼보인다.

0개의 댓글