|
| 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