|
| 1 | +--- |
| 2 | +sidebar_position: 2 |
| 3 | +title: 알고리즘 |
| 4 | +description: 알고리즘의 개념과 표현 방법 / 성능 분석 방법을 설명합니다 |
| 5 | +--- |
| 6 | + |
| 7 | +## 1. 알고리즘의 이해 |
| 8 | + |
| 9 | +### 정의 |
| 10 | + |
| 11 | +**알고리즘**은 "문제해결 방법을 추상화하여 단계적 절차를 논리적으로 기술해 놓은 명세서"입니다. |
| 12 | + |
| 13 | +### 프로그램과의 관계 |
| 14 | + |
| 15 | +프로그램은 **자료구조(data structure)** 와 **알고리즘(algorithm)** 으로 구성됩니다. |
| 16 | + |
| 17 | +### 알고리즘의 조건 |
| 18 | + |
| 19 | +효과적인 알고리즘이 되기 위해서는 다음 5가지 조건을 충족해야 합니다. |
| 20 | + |
| 21 | +| 조건 | 설명 | |
| 22 | +| ------------------------- | ------------------------------------------------------------- | |
| 23 | +| **입력(input)** | 알고리즘 수행에 필요한 자료가 외부에서 입력으로 제공되어야 함 | |
| 24 | +| **출력(output)** | 알고리즘 수행 후 하나 이상의 결과를 출력해야 함 | |
| 25 | +| **명확성(definiteness)** | 수행할 작업의 내용과 순서가 명확하게 명세되어야 함 | |
| 26 | +| **유한성(finiteness)** | 알고리즘은 수행 뒤에 반드시 종료되어야 함 | |
| 27 | +| **효과성(effectiveness)** | 알고리즘의 모든 명령어는 기본적이며 실행 가능해야 함 | |
| 28 | + |
| 29 | +### 올바른 알고리즘 |
| 30 | + |
| 31 | +"어떠한 경우에도 실행 결과가 똑같이 나오는 것"을 의미합니다. 만약 실행 결과가 경우에 따라 맞거나 틀리면 올바른 알고리즘이라고 할 수 없습니다. |
| 32 | + |
| 33 | +> **학습 목표**: 알고리즘의 개념을 이해하고, 알고리즘의 표현 방법을 설명할 수 있으며, 성능 분석 방법을 설명하고, 간단한 프로그램을 통해 알고리즘을 이해하고 정의 등을 설명할 수 있습니다. |
| 34 | +
|
| 35 | +<br/ > |
| 36 | + |
| 37 | +--- |
| 38 | + |
| 39 | +<br/ > |
| 40 | + |
| 41 | +## 2. 알고리즘의 표현 방법 |
| 42 | + |
| 43 | +알고리즘은 다양한 방법으로 표현될 수 있으며, 주요 방법은 다음과 같습니다. |
| 44 | + |
| 45 | +<br/ > |
| 46 | + |
| 47 | +### 2.1 자연어를 이용한 서술적 표현 방법 |
| 48 | + |
| 49 | +일상 언어로 알고리즘을 설명합니다. |
| 50 | + |
| 51 | +> **예시**: 딸기 시럽 치즈케이크 만들기 |
| 52 | +
|
| 53 | +<br/ > |
| 54 | + |
| 55 | +### 2.2 순서도(flow chart)를 이용한 도식화 표현 방법 |
| 56 | + |
| 57 | +문제에 대한 정의, 분석, 해법을 그림으로 표현합니다. |
| 58 | + |
| 59 | +순서도에는 다음과 같은 다양한 기호가 사용됩니다: |
| 60 | + |
| 61 | +- **데이터**, **처리**, **미리 정의한 처리**, **판단**, **선**, **단말**, **루프 범위** 등 |
| 62 | + |
| 63 | +> **예시**: 1부터 5까지의 합을 구하는 알고리즘 순서도 |
| 64 | +
|
| 65 | +<br/ > |
| 66 | + |
| 67 | +### 2.3 프로그래밍 언어를 이용한 구체화 방법 |
| 68 | + |
| 69 | +특정 프로그래밍 언어로 직접 코드를 작성합니다. |
| 70 | + |
| 71 | +<br/ > |
| 72 | + |
| 73 | +### 2.4 가상코드(pseudo-code)를 이용한 추상화 방법 |
| 74 | + |
| 75 | +프로그래밍 언어의 일반적인 형태와 유사하게 알고리즘을 표현하지만, 특정 언어는 아니므로 직접 실행은 불가능합니다. 특정 프로그래밍 언어로의 변환이 용이합니다. |
| 76 | + |
| 77 | +#### 기본 요소 |
| 78 | + |
| 79 | +- **변수**, **자료형**(정수형, 실수형, 문자형 등), **연산자**(산술, 관계, 논리) 등을 사용 |
| 80 | + |
| 81 | +#### 지정문 형식 |
| 82 | + |
| 83 | +``` |
| 84 | +변수 <- 값; (예: a <- 5;) |
| 85 | +``` |
| 86 | + |
| 87 | +#### 제어 구조 |
| 88 | + |
| 89 | +알고리즘의 흐름을 제어하는 방식입니다. |
| 90 | + |
| 91 | +##### 조건문 |
| 92 | + |
| 93 | +조건에 따라 실행할 명령문이 결정되는 선택적 제어 구조입니다. |
| 94 | + |
| 95 | +- `if-then-else`형, `if-then`형 |
| 96 | +- **다단계 조건문**, **중첩 if문** |
| 97 | +- **case문**: 여러 조건식 중 해당 조건을 찾아 명령문을 수행하며, 중첩 if문으로 표현 가능 |
| 98 | + |
| 99 | +##### 반복문(loop) |
| 100 | + |
| 101 | +일정한 명령을 반복 수행하는 제어 구조입니다. |
| 102 | + |
| 103 | +**반복문의 종류**: |
| 104 | + |
| 105 | +```pseudo |
| 106 | +for (초깃값; 조건식; 증감값) do 명령문; |
| 107 | +while (조건식) do 명령문; |
| 108 | +do 명령문; while (조건식); |
| 109 | +``` |
| 110 | + |
| 111 | +**반복문의 특징**: |
| 112 | + |
| 113 | +- **사전 판단 반복** (`while`, `for`): 실행 전에 반복 여부를 판단하며, 제어식 결과가 0이면 루프 본문이 한 번도 실행되지 않을 수 있음 |
| 114 | +- **사후 판단 반복** (`do-while`): 루프 본문을 한 번 실행한 다음에 반복 여부를 판단하며, 루프 본문이 적어도 한 번은 실행됨 |
| 115 | +- **다중 루프**: 반복문 안에 다시 반복문이 중첩되는 구조 (이중 루프, 삼중 루프 등) |
| 116 | + |
| 117 | +##### 함수문 |
| 118 | + |
| 119 | +처리 작업을 별도 모듈화하여 만든 부프로그램입니다. |
| 120 | + |
| 121 | +```pseudo |
| 122 | +함수 이름(매개변수) |
| 123 | + 명령문; |
| 124 | + ... |
| 125 | + return 결괏값; |
| 126 | +end |
| 127 | +``` |
| 128 | + |
| 129 | +<br/ > |
| 130 | + |
| 131 | +--- |
| 132 | + |
| 133 | +## 3. 알고리즘의 성능 분석 |
| 134 | + |
| 135 | +알고리즘의 성능을 분석하는 기준과 방법은 다음과 같습니다. |
| 136 | + |
| 137 | +### 3.1 성능 분석 기준 |
| 138 | + |
| 139 | +| 기준 | 설명 | |
| 140 | +| ----------------- | ------------------------------------------------------------------------ | |
| 141 | +| **정확성** | 올바른 자료 입력 시 유한한 시간 내에 올바른 결과 출력 여부 | |
| 142 | +| **명확성** | 알고리즘이 얼마나 이해하기 쉽고 명확하게 작성되었는지 여부 | |
| 143 | +| **수행량** | 일반적인 연산을 제외하고, 알고리즘의 특성을 나타내는 중요 연산 모두 분석 | |
| 144 | +| **메모리 사용량** | 알고리즘이 실행되는 동안 필요한 메모리 양 측정 | |
| 145 | +| **최적성** | 시간 복잡도와 공간 복잡도 | |
| 146 | + |
| 147 | +<br/ > |
| 148 | + |
| 149 | +### 3.2 성능 분석 방법 |
| 150 | + |
| 151 | +#### 공간 복잡도 |
| 152 | + |
| 153 | +"알고리즘을 프로그램으로 실행하여 완료하기까지 필요한 총 저장 공간의 양"을 나타냅니다. |
| 154 | + |
| 155 | +``` |
| 156 | +공간 복잡도 = 고정 공간 + 가변 공간 |
| 157 | +``` |
| 158 | + |
| 159 | +#### 시간 복잡도 |
| 160 | + |
| 161 | +"알고리즘을 프로그램으로 실행하여 완료하기까지의 총 소요시간"을 나타냅니다. |
| 162 | + |
| 163 | +``` |
| 164 | +시간 복잡도 = 컴파일 시간 + 실행 시간 |
| 165 | +``` |
| 166 | + |
| 167 | +> **참고**: 컴파일 시간은 거의 고정적이므로, 실행 시간을 주로 분석합니다. 실행 시간은 컴퓨터 성능에 따라 달라질 수 있어, 실제 실행 시간보다는 명령문의 실행 빈도수에 따라 계산합니다. |
| 168 | +
|
| 169 | +**기본 명령문**: 지정문, 조건문, 반복문 내의 제어문과 반환문은 실행 시간 차이가 거의 없으므로 하나의 단위 시간을 갖는 기본 명령문으로 취급합니다. |
| 170 | + |
| 171 | +<br/ > |
| 172 | + |
| 173 | +### 3.3 표기법 (점근적 표기법) |
| 174 | + |
| 175 | +알고리즘의 성능을 나타내는 수학적 표기법입니다. |
| 176 | + |
| 177 | +<br/ > |
| 178 | + |
| 179 | +#### 빅-오 표기법 (Big-O Notation) |
| 180 | + |
| 181 | +`O(f(n))`으로 표기하며, 함수의 상한을 나타냅니다. |
| 182 | + |
| 183 | +> **의미**: "최악의 경우에도 g(n)의 수행 시간 안에는 알고리즘 수행 완료 보장" |
| 184 | +
|
| 185 | +**표기 방법**: 실행 시간 함수에서 가장 큰 영향을 주는 n에 대한 항을 하나 선택하고 계수를 생략하여 표기합니다. |
| 186 | + |
| 187 | +> **예시**: 피보나치 수열 실행 시간 함수 `4n+2`는 `O(n)`으로 표기 |
| 188 | +
|
| 189 | +<br/ > |
| 190 | + |
| 191 | +#### 빅-오메가 표기법 (Big-Omega Notation) |
| 192 | + |
| 193 | +`Ω(f(n))`으로 표기하며, 함수의 하한을 나타냅니다. |
| 194 | + |
| 195 | +> **의미**: "어떤 알고리즘의 시간 복잡도가 Ω(g(n))으로 분석되었다면, 이 알고리즘 수행에는 적어도 g(n)의 수행 시간이 필요함" |
| 196 | +
|
| 197 | +<br/ > |
| 198 | + |
| 199 | +#### 빅-세타 표기법 (Big-Theta Notation) |
| 200 | + |
| 201 | +`θ(f(n))`으로 표기하며, 상한과 하한이 같은 정확한 차수를 표현하기 위한 표기법입니다. |
| 202 | + |
| 203 | +**조건**: `f(n)= θ(g(n))`이 되려면 `f(n)= O(g(n))`이면서 `f(n)= Ω(g(n))`이어야 합니다. |
| 204 | + |
| 205 | +<br/ > |
| 206 | + |
| 207 | +### 3.4 n값 변화에 따른 실행 빈도수 및 수행 시간 비교 |
| 208 | + |
| 209 | +각 실행 시간 함수에서 n값의 변화에 따른 실행 빈도수와 알고리즘 수행 시간을 비교하여 효율성을 분석할 수 있습니다. |
| 210 | + |
| 211 | +<br/ > |
| 212 | + |
| 213 | +--- |
| 214 | + |
| 215 | +## 4. 알고리즘 실습 예시 |
| 216 | + |
| 217 | +<br/ > |
| 218 | + |
| 219 | +### 4.1 기본 구조 활용 |
| 220 | + |
| 221 | +#### 세 정수의 최댓값 구하기 |
| 222 | + |
| 223 | +**순차 구조**와 **선택 구조**를 활용하여 세 정수 중 최댓값을 찾는 프로그램입니다. |
| 224 | + |
| 225 | +#### 조건 판단과 분기 학습 |
| 226 | + |
| 227 | +입력한 정숫값의 부호(양수/음수/0)를 판단하여 출력하는 프로그램으로, 프로그램 흐름이 여러 가지로 분기되는 것을 학습합니다. |
| 228 | + |
| 229 | +<br/ > |
| 230 | + |
| 231 | +### 4.2 반복 구조 학습 |
| 232 | + |
| 233 | +#### 1부터 n까지 정수의 합 구하기 |
| 234 | + |
| 235 | +`while`문과 `for`문을 사용하여 **반복 구조**를 학습합니다. |
| 236 | + |
| 237 | +#### 양수만 입력받기 |
| 238 | + |
| 239 | +`do-while`문을 사용하여 **사후 판단 반복**을 학습합니다. |
| 240 | + |
| 241 | +<br/ > |
| 242 | + |
| 243 | +### 4.3 다중 루프 |
| 244 | + |
| 245 | +#### 구구단 곱셈표 출력 |
| 246 | + |
| 247 | +**이중 루프**의 개념을 학습하는 프로그램입니다. |
| 248 | + |
| 249 | +#### 왼쪽 아래 직각 이등변 삼각형 출력 |
| 250 | + |
| 251 | +**이중 루프**를 활용한 도형 출력 프로그램을 통해 다중 반복문의 개념을 학습합니다. |
| 252 | + |
| 253 | +--- |
| 254 | + |
| 255 | +> **💡 핵심 포인트**: 알고리즘 학습에서는 다양한 제어 구조(순차, 선택, 반복)를 조합하여 복잡한 문제를 해결하는 능력을 기르는 것이 중요합니다. |
0 commit comments