알고리즘 예제 풀이
동적 메모리 할당 및 구조체 배열 활용
동적 메모리 할당(malloc
)을 사용하여 구조체 배열을 생성하고 사용하는 방법입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct st {
int num;
char dept[20];
};
struct st *stp;
stp = (struct st *)malloc(SIZE * sizeof(struct st));
stp[0].num = 1;
strcpy(stp[0].dept, "swEngineering");
stp
포인터가 가리키는 구조체 배열에 대한 메모리입니다. 이 메모리는malloc
함수를 통해 동적으로 할당되며, 사용이 끝난 후에는 반드시free
함수를 사용하여 해제해야 합니다.
Swap 알고리즘
두 변수의 값을 교환하는 기본적인 기법입니다.
int a = 10, b = 20, temp;
temp = a;
a = b;
b = temp;
실제 사용 예시로는 함수 호출을 통해 두 변수의 값을 교환하는 방법이 있습니다.
#include <stdio.h>
void change(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
정렬 알고리즘
다양한 정렬 알고리즘의 원리와 구현 예시입니다.
모든 정렬 알고리즘은 앞서 Swap 알고리즘에서 작성한
change(tmp[i], tmp[j])
함수를 통해 요소들의 위치를 교환합니다.
순차 정렬 (Sequential Sort)
현재 요소와 배열의 나머지 모든 요소를 비교하여 필요에 따라 교환합니다.
for (i = 0; i < n - 1; i++) {
for (j = i; j < n; j++) {
if (tmp[i] > tmp[j]) { // 앞쪽 원소가 더 크면
change(tmp[i], tmp[j]); // 교환
}
}
}
선택 정렬 (Selection Sort)
매 반복마다 남은 요소들 중 가장 작은(또는 큰) 요소를 찾아 현재 위치의 요소와 교환합니다.
for (i = 0; i < N - 1; i++) { // 정렬 범위
min = i;
for (j = i + 1; j < N; j++) {
if (tmp[j] < tmp[min]) min = j;
}
change(tmp[i], tmp[min]);
}
버블 정렬 (Bubble Sort)
인접한 두 요소를 비교하여 정렬 순서에 맞지 않으면 교환하는 과정을 반복합니다.
for (i = N - 1; i > 0; i--) {
for (j = 0; j < i; j++) {
if (tmp[j] > tmp[j + 1]) {
change(tmp[j], tmp[j + 1]); // 교환
}
}
}
최대, 최소 구하기
배열 내에서 최대값과 최소값을 찾는 알고리즘입니다.
int a[5] = {1, 2, 3, 4, 5};
int max = a[0];
for (int i = 1; i < 5; i++) {
if (max < a[i]) max = a[i];
}
// 최소값도 유사하게 구함
데이터 처리 및 통계 관련 알고리즘
빈도 구하기
특정 범위 내의 입력 숫자의 빈도를 계산하는 예제입니다.
int a[SIZE] = {0};
int value;
scanf("%d", &value);
a[value]++;
// 또는 a[value - 1]++; // 배열 인덱싱 오류에 주의
짝수/홀수 개수 구하기
입력된 숫자들의 짝수와 홀수 개수를 세는 알고리즘입니다.
int a[SIZE] = {0};
int i, odd = 0, even = 0;
for (i = 0; i < SIZE; i++) {
printf("%d 번째 수: ", i + 1);
scanf("%d", &a[i]);
if (a[i] % 2 == 0)
even++;
else
odd++;
}
printf("짝수: %d, 홀수: %d\n", even, odd);
재귀 함수를 이용한 알고리즘
Factorial 구하기
재귀 함수를 이용하여 n의 팩토리얼을 계산합니다.
int fac(int n) {
if (n <= 1) return 1;
else return fac(n - 1) * n;
}
Fibonacci 구하기
재귀 함수를 이용하여 n번째 피보나치 수를 계산합니다.
int fibo(int n) {
if (n <= 2) return 1;
else return fibo(n - 2) + fibo(n - 1);
}