알고리즘(Algorithm)이란 문제를 해결하거나 특정 작업을 수행하기 위한 명확하고 단계적인 절차나 규칙의 집합을 의미합니다. 컴퓨터 과학 및 프로그래밍에서 중요한 개념으로, 데이터를 처리하고, 계산을 수행하며, 자동화된 작업을 효율적으로 수행하기 위해 사용됩니다.
### 알고리즘의 특성
1. **명확성**: 각 단계가 명확하고 이해하기 쉬워야 합니다.
2. **유한성**: 알고리즘은 유한한 단계 내에서 반드시 종료되어야 합니다.
3. **입력과 출력**: 하나 이상의 입력을 받아 하나 이상의 출력을 생성해야 합니다.
4. **효율성**: 자원(시간과 공간)을 최소화하면서 문제를 해결해야 합니다.
5. **일반성**: 특정 문제뿐만 아니라 유사한 문제를 해결할 수 있어야 합니다.
---
### 알고리즘의 종류
1. **정렬 알고리즘**
- 버블 정렬, 삽입 정렬, 선택 정렬, 퀵 정렬, 병합 정렬 등.
- 데이터를 특정 기준에 따라 정렬하는 데 사용됩니다.
2. **탐색 알고리즘**
- 이진 탐색, 선형 탐색 등.
- 데이터에서 특정 요소를 찾는 방법을 제공합니다.
3. **그래프 알고리즘**
- 다익스트라, 플로이드-와샬, DFS(깊이 우선 탐색), BFS(너비 우선 탐색) 등.
- 네트워크 구조나 경로 탐색에 사용됩니다.
4. **분할과 정복(Divide and Conquer)**
- 문제를 더 작은 문제로 나눈 다음, 해결한 결과를 합치는 방식입니다.
- 예: 퀵 정렬, 병합 정렬.
5. **동적 프로그래밍(Dynamic Programming)**
- 문제를 더 작은 하위 문제로 나누고, 해결된 하위 문제의 결과를 저장하여 반복 계산을 피하는 방식.
- 예: 피보나치 수열, 배낭 문제.
6. **기타**
- 탐욕 알고리즘(Greedy Algorithm): 최적의 선택을 반복적으로 수행.
- 백트래킹(Backtracking): 모든 가능한 해를 탐색하는 과정에서 불필요한 해를 가지치기.
---
### 알고리즘의 평가
1. **[[시간 복잡도]](Time Complexity)**: 알고리즘이 실행되는 데 걸리는 시간을 측정.
- Big-O 표기법으로 표현: O(n),O(n2),O(logn)O(n), O(n^2), O(\log n) 등.
2. **공간 복잡도(Space Complexity)**: 알고리즘이 사용하는 메모리 공간.
---
### 알고리즘 학습을 위한 팁
1. **기본 문제 풀이 연습**: 정렬, 탐색, 재귀 같은 기초적인 문제부터 시작.
2. **온라인 플랫폼 활용**: LeetCode, 백준, Programmers, Codeforces 등.
3. **수학적 사고력 강화**: 알고리즘 설계와 분석은 논리적 사고와 수학적 배경이 중요합니다.
4. **코드 리뷰와 최적화**: 작성한 알고리즘을 분석하고 개선하는 과정도 중요합니다.
**1. [[정렬 알고리즘]] (Sorting Algorithms)**
- 정렬 알고리즘은 데이터 집합을 특정 순서(예: 오름차순, 내림차순)로 재배열하는 알고리즘입니다.
- 버블 정렬 (Bubble Sort)
- 삽입 정렬 (Insertion Sort)
- 선택 정렬 (Selection Sort)
- 병합 정렬 (Merge Sort)
- 퀵 정렬 (Quick Sort)
- 힙 정렬 (Heap Sort)
**2. 탐색 알고리즘 (Searching Algorithms)**
- 탐색 알고리즘은 데이터 집합에서 특정 항목을 찾는 알고리즘입니다.
- 선형 탐색 (Linear Search)
- 이진 탐색 (Binary Search)
- 깊이 우선 탐색 (Depth-First Search, DFS)
- 너비 우선 탐색 (Breadth-First Search, BFS)
**3. 그래프 알고리즘 (Graph Algorithms)**
- 그래프 알고리즘은 그래프(정점과 간선으로 이루어진 자료 구조)에서 문제를 해결하는 알고리즘입니다.
- 최단 경로 알고리즘 (Dijkstra, Floyd-Warshall)
- 최소 신장 트리 알고리즘 (Prim, Kruskal)
- 위상 정렬 (Topological Sort)
**4. 동적 프로그래밍 (Dynamic Programming)**
- 동적 프로그래밍은 복잡한 문제를 작은 하위 문제로 나누어 해결하고, 하위 문제의 결과를 저장하여 중복 계산을 피하는 알고리즘 설계 기법입니다.
- 피보나치 수열
- 최장 공통 부분 수열 (Longest Common Subsequence, LCS)
- 배낭 문제 (Knapsack Problem)
**5. 탐욕 알고리즘 (Greedy Algorithms)**
- 탐욕 알고리즘은 각 단계에서 최적의 선택을 하는 방식으로 문제를 해결하는 알고리즘입니다.
- 최소 신장 트리 알고리즘 (Kruskal, Prim)
- 허프만 코딩 (Huffman Coding)
- 거스름돈 문제
**6. 기계 학습 알고리즘 (Machine Learning Algorithms)**
- 기계 학습 알고리즘은 데이터로부터 학습하여 예측이나 분류를 수행하는 알고리즘입니다.
- 지도 학습 (Supervised Learning): 선형 회귀, 로지스틱 회귀, 의사 결정 트리, 서포트 벡터 머신 (SVM), 신경망
- 비지도 학습 (Unsupervised Learning): K-평균 클러스터링, 계층적 클러스터링, 주성분 분석 (PCA)
- 강화 학습 (Reinforcement Learning): Q-러닝, SARSA
**7. 암호화 알고리즘 (Cryptography Algorithms)**
- 암호화 알고리즘은 데이터를 안전하게 보호하기 위해 사용되는 알고리즘입니다.
- 대칭키 암호화 (AES, DES)
- 비대칭키 암호화 (RSA, ECC)
- 해시 함수 (SHA-256, MD5)
이 외에도 다양한 알고리즘 분류가 있으며, 각 알고리즘은 특정 문제 해결에 특화되어 있습니다.