Skip to content

Commit cc40e1f

Browse files
committed
docs: C 프로그래밍 14
- 알고리즘 예제 풀이 추가
1 parent 8b227ca commit cc40e1f

File tree

1 file changed

+177
-0
lines changed
  • docs/C프로그래밍-활용

1 file changed

+177
-0
lines changed

docs/C프로그래밍-활용/14.md

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
---
2+
sidebar_position: 14
3+
title: 알고리즘 예제 풀이
4+
description: 문제 해결을 위한 다양한 알고리즘을 이해하고 코드를 작성하는 방법을 다룹니다.
5+
---
6+
7+
## 동적 메모리 할당 및 구조체 배열 활용
8+
9+
동적 메모리 할당(`malloc`)을 사용하여 구조체 배열을 생성하고 사용하는 방법입니다.
10+
11+
```c
12+
#include <stdio.h>
13+
#include <stdlib.h>
14+
#include <string.h>
15+
16+
struct st {
17+
int num;
18+
char dept[20];
19+
};
20+
21+
struct st *stp;
22+
stp = (struct st *)malloc(SIZE * sizeof(struct st));
23+
stp[0].num = 1;
24+
strcpy(stp[0].dept, "swEngineering");
25+
```
26+
27+
- `stp` 포인터가 가리키는 구조체 배열에 대한 메모리입니다. 이 메모리는 `malloc` 함수를 통해 동적으로 할당되며, 사용이 끝난 후에는 반드시 `free` 함수를 사용하여 해제해야 합니다.
28+
29+
---
30+
31+
## Swap 알고리즘
32+
33+
두 변수의 값을 교환하는 기본적인 기법입니다.
34+
35+
```c
36+
int a = 10, b = 20, temp;
37+
temp = a;
38+
a = b;
39+
b = temp;
40+
```
41+
42+
실제 사용 예시로는 함수 호출을 통해 두 변수의 값을 교환하는 방법이 있습니다.
43+
44+
```c
45+
#include <stdio.h>
46+
47+
void change(int *a, int *b) {
48+
int temp = *a;
49+
*a = *b;
50+
*b = temp;
51+
}
52+
```
53+
54+
---
55+
56+
## 정렬 알고리즘
57+
58+
다양한 정렬 알고리즘의 원리와 구현 예시입니다.<br/ >
59+
모든 정렬 알고리즘은 앞서 Swap 알고리즘에서 작성한<br/ >
60+
`change(tmp[i], tmp[j])` 함수를 통해 요소들의 위치를 교환합니다.
61+
62+
### 순차 정렬 (Sequential Sort)
63+
64+
현재 요소와 배열의 나머지 모든 요소를 비교하여 필요에 따라 교환합니다.
65+
66+
```c
67+
for (i = 0; i < n - 1; i++) {
68+
for (j = i; j < n; j++) {
69+
if (tmp[i] > tmp[j]) { // 앞쪽 원소가 더 크면
70+
change(tmp[i], tmp[j]); // 교환
71+
}
72+
}
73+
}
74+
```
75+
76+
### 선택 정렬 (Selection Sort)
77+
78+
매 반복마다 남은 요소들 중 가장 작은(또는 큰) 요소를 찾아 현재 위치의 요소와 교환합니다.
79+
80+
```c
81+
for (i = 0; i < N - 1; i++) { // 정렬 범위
82+
min = i;
83+
for (j = i + 1; j < N; j++) {
84+
if (tmp[j] < tmp[min]) min = j;
85+
}
86+
change(tmp[i], tmp[min]);
87+
}
88+
```
89+
90+
### 버블 정렬 (Bubble Sort)
91+
92+
인접한 두 요소를 비교하여 정렬 순서에 맞지 않으면 교환하는 과정을 반복합니다.
93+
94+
```c
95+
for (i = N - 1; i > 0; i--) {
96+
for (j = 0; j < i; j++) {
97+
if (tmp[j] > tmp[j + 1]) {
98+
change(tmp[j], tmp[j + 1]); // 교환
99+
}
100+
}
101+
}
102+
```
103+
104+
---
105+
106+
## 최대, 최소 구하기
107+
108+
배열 내에서 최대값과 최소값을 찾는 알고리즘입니다.
109+
110+
```c
111+
int a[5] = {1, 2, 3, 4, 5};
112+
int max = a[0];
113+
for (int i = 1; i < 5; i++) {
114+
if (max < a[i]) max = a[i];
115+
}
116+
// 최소값도 유사하게 구함
117+
```
118+
119+
---
120+
121+
## 데이터 처리 및 통계 관련 알고리즘
122+
123+
### 빈도 구하기
124+
125+
특정 범위 내의 입력 숫자의 빈도를 계산하는 예제입니다.
126+
127+
```c
128+
int a[SIZE] = {0};
129+
int value;
130+
scanf("%d", &value);
131+
a[value]++;
132+
// 또는 a[value - 1]++; // 배열 인덱싱 오류에 주의
133+
```
134+
135+
### 짝수/홀수 개수 구하기
136+
137+
입력된 숫자들의 짝수와 홀수 개수를 세는 알고리즘입니다.
138+
139+
```c
140+
int a[SIZE] = {0};
141+
int i, odd = 0, even = 0;
142+
for (i = 0; i < SIZE; i++) {
143+
printf("%d 번째 수: ", i + 1);
144+
scanf("%d", &a[i]);
145+
if (a[i] % 2 == 0)
146+
even++;
147+
else
148+
odd++;
149+
}
150+
printf("짝수: %d, 홀수: %d\n", even, odd);
151+
```
152+
153+
---
154+
155+
## 재귀 함수를 이용한 알고리즘
156+
157+
### Factorial 구하기
158+
159+
재귀 함수를 이용하여 n의 팩토리얼을 계산합니다.
160+
161+
```c
162+
int fac(int n) {
163+
if (n <= 1) return 1;
164+
else return fac(n - 1) * n;
165+
}
166+
```
167+
168+
### Fibonacci 구하기
169+
170+
재귀 함수를 이용하여 n번째 피보나치 수를 계산합니다.
171+
172+
```c
173+
int fibo(int n) {
174+
if (n <= 2) return 1;
175+
else return fibo(n - 2) + fibo(n - 1);
176+
}
177+
```

0 commit comments

Comments
 (0)