최대값,최소값 찾기
int max = a;
if (b > max) max = b;
if (c > max) max = c;
3가지 숫자 중에서 최대값 찾기
int mIN = a;
if (b < max) min = b;
if (c < max) min = c;
3가지 숫자 중에서 최소값 찾기
4가지 숫자인 경우
int max=a;
if (b > max)
max = b;
if (c > max)
max = c;
if (d > max)
max = d;
숫자가 많아짐에따라 if문을 계속 만드는 것이 귀찮기 때문에 배열을 활용할 생각도 해볼 수 있다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b, c,d;
printf("네 정수의 최댓값을 구합니다.\n");
printf("a값: "); scanf("%d", &a);
printf("b값: "); scanf("%d", &b);
printf("c값: "); scanf("%d", &c);
printf("d값: "); scanf("%d", &d);
int max = a;
if (b > max)
max = b;
if (c > max)
max = c;
if (d > max)
max = d;
printf("최댓값은 %d입니다.\n", max);
return 0;
}
위와 같은 실행 코드가 배열을 활용하면 다음과 같이 사용 가능하다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int N;
printf("정수의 개수를 입력하시오: ");
scanf("%d", &N);
int* a = (int*)malloc(N * sizeof(int));
if (a == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
printf("%d개의 정수의 최댓값을 구합니다.\n",N);
for (int i = 0; i < N; i++) {
scanf("%d", &a[i]);
}
int max = a[0];
for (int i = 1; i < N; i++) {
if (a[i] > max) {
max = a[i];
}
}
printf("최댓값은 %d입니다.\n", max);
free(a);
return 0;
}
입력받은 숫자의 개수가 가변적일때 사용하기 위해서 배열의 크기를 N개로 설정해서 동적메모리설정을 해줘야해서 복잡해졌는데, 요지는 이렇다.
int max = a[0];
for (int i = 1; i < N; i++) {
if (a[i] > max) {
max = a[i];
}
}
숫자가 나열된 배열이 주어져 있다고 생각하고 보면
우선 첫항을 max로 두고
두번째 항부터 마지막 항까지의 배열 요소들 중에서
max(지금은 첫항)보다 큰 값이 있다면 그것을 바로 max로 설정한다.
두번째항(a[1])부터 마지막 항(a[N-1])까지 하나씩 반복문을 이용하여 확인해보는것이다.
이때 if조건문, 선택(selection)구조를 이용한다.
최소값은 max대신에 min으로 두고 같은 방식으로 비교 연산자(<,>)만 반대로 수정하면된다.
중앙값 찾기
이제 중요한 중앙값 설명을 해보려고한다.
그동안 최댓값 최솟값은 여러방법으로 사용해와서 익숙하기도 하고 이미 외우고 있을 정도이니
이번에는 그만큼 알아두면 자주 쓰이는 중앙값 찾는 알고리즘에 대해 알아보자.
#include <stdio.h>
/*--- a, b, c의 중앙값 ---*/
int med3(int a, int b, int c)
{
if (a >= b)
if (b >= c)
return b; //(a>b>c)
else if (a <= c)
return a; //(c>a>b)
else
return c; //(a>c>b)
else if (a > c)
return a; //(b>a>c)
else if (b > c)
return c; //(b>c>a)
else
return b; //(C>b>a)
}
int main(void)
{
int a, b, c;
printf("세 정수의 중앙값을 구합니다.\n");
printf("a값: "); scanf("%d", &a);
printf("b값: "); scanf("%d", &b);
printf("c값: "); scanf("%d", &c);
printf("중앙값은%d입니다.\n", med3(a, b, c));
return 0;
}
천천히 살펴보면
a가 b보다 크거나 같으면 1. b가 c보다 크거나 같은경우 ---> (a>b>c) b가 중앙값
2. b가 c보다 작고 a가 c보다 작거나 같은경우 ----> (c>a>b) a가 중앙값
3. 1,2번 경우 모두 아닌경우 ---> (a>c>b) c가 중앙값
a가 b보다 작으면서 1. c보다 큰경우 ---> (b>a>c) a가 중앙값
2. a가 c보다 작고 b가 c보다 큰경우 ---> (b>c>a) c가 중앙값
3. 1,2번 경우 모두 아닌경우 ---> (c>b>a) b가 중앙값
여러개의 if문을 사용해서 매우 복잡해보인다. 만약 숫자가 3개가 아닌 4개나 5개이상인 경우는 어떻게 해야할지 생각해보았다.
마찬가지로 배열을 활용하면 수월하다.
후에 따로 정리할 quicksort (퀵정렬)을 활용하여 배열을 정렬하고 중간 요소를 출력하면된다. 코드는 다음과 같다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int compare(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
int main(void) {
int numbers[5];
printf("5개의 정수를 입력하시오: ");
for (int i = 0; i < 5; i++) {
scanf("%d", &numbers[i]);
}
// 배열을 정렬
qsort(numbers, 5, sizeof(int), compare);
// 중앙값을 출력
printf("중앙값은 %d입니다.\n", numbers[2]);
return 0;
}
'DSA' 카테고리의 다른 글
연결 리스트 예제 (0) | 2024.07.14 |
---|---|
연결 리스트 (linked list) (0) | 2024.07.13 |
백준 10811번 배열 부분 역순 정렬 (0) | 2024.06.23 |
백준 3052번 배열 원소 서로 다른 값 찾기 (0) | 2024.06.21 |
백준 5597번 배열의 차집합 활용 (0) | 2024.06.21 |