본문으로 건너뛰기

알고리즘 예제 풀이

동적 메모리 할당 및 구조체 배열 활용

동적 메모리 할당(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);
}