Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 알고리즘
- 욕심쟁이 방법
- Pager
- spring boot
- 인프런워밍업클럽
- mysql 표
- 순차탐색
- table status
- MySQL
- CS스터디
- Less
- 스터디2기
- 인프런
- mycli
- 네트워킹데이
- 맥
- zsh theme
- 데이크스트라
- 동적 프로그래밍 방법
- mysql 표 출력
- 오일러 경로
- cs
- 이진탐색
- 분할정복 방법
- 티스토리챌린지
- VI
- zsh
- 터미널
- 오블완
- oh-my-zsh
Archives
- Today
- Total
Develop
[Algorithm] 알고리즘의 기초 개념과 대표적인 설계 기법 정리 본문
안녕하세요 .ᐟ
알고리즘 기초 개념과 대표적인 설계 기법을 알아보겠습니다.
1. 알고리즘의 기본 개념
알고리즘이란 주어진 문제를 해결하거나 함수를 계산하기 위해 따라야 할 명령어들을 단계적으로 나열한 것을 말합니다.
알고리즘의 성립 조건
- 입출력: 0개 이상의 외부 입력과 1개 이상의 출력이 있어야 함.
- 명확성: 각 명령은 모호하지 않고 단순 명확해야 함.
- 유한성: 한정된 단계를 거친 후에는 반드시 종료되어야 함.
- 유효성: 모든 명령은 컴퓨터에서 수행 가능해야 함.
- 효율성: 실용적인 관점에서 알고리즘은 효율적이어야 함.
주요 문제 예시
- 오일러 경로(Eulerian Path): 그래프의 모든 간선을 오직 한 번씩만 지나는 경로입니다.
규칙 : 모든 정점의 차수가 홀수인 정점이 0개 또는 2개일 때 존재하며, 2개일 경우 반드시 홀수점에서 시작해야 합니다. - 데이크스트라(Dijkstra): 최단 경로를 찾는 알고리즘입니다.
2. 탐색 알고리즘 (Search)
순차 탐색 vs 이진 탐색
- 순차 탐색: 데이터를 처음부터 끝까지 차례대로 확인합니다.
- 이진 탐색(Binary Search): 정렬된 데이터에서 중앙값을 기준으로 탐색 범위를 절반씩 줄여나가는 방식입니다.
[Java] 이진 탐색 구현 예시
public static int BinarySearch(int[] A, int key, int left, int right) {
if (left > right) return -1; // 찾지 못함
int mid = (left + right) / 2;
if (A[mid] == key) {
return mid; // 탐색 성공
} else if (key < A[mid]) {
return BinarySearch(A, key, left, mid - 1); // 왼쪽 부분 탐색
} else {
return BinarySearch(A, key, mid + 1, right); // 오른쪽 부분 탐색
}
}
3. 알고리즘 설계 기법
1) 욕심쟁이 방법 (Greedy Method)
탐욕 알고리즘 / 그리디 알고리즘 이라고 부르기도 합니다.
각 단계에서 전후 상관없이 현재 상황에서 '가장 최선'이라고 여겨지는 해(국부적 최적해)를 선택해 나가는 전략입니다.
- 동전 거스름돈 문제: 액면가가 큰 동전부터 최대한 많이 선택합니다.
다만, 동전의 종류가 일반적인 경우에는 최적해를 보장하지 못할 수도 있습니다. - 배낭 문제 (Fractional Knapsack): 물체를 쪼갤 수 있는 경우, '단위 무게당 이익'이 큰 순서대로 넣으면 최적해를 구할 수 있습니다.
- 주의: 물체를 쪼갤 수 없는 0/1 배낭 문제는 욕심쟁이 방법으로 해결이 불가능합니다.
2) 분할정복 방법 (Divide-and-Conquer)
큰 문제를 더 이상 나눌 수 없을 때까지 작은 문제로 순환적으로 분할한 뒤, 각각 해결하고 결합하는 하향식(Top-down) 접근 방식입니다.
- 특징: 분할된 작은 문제는 원래 문제와 동일하며 서로 독립적입니다.
- 단계: 분할 → 정복 → 결합
- 대표 적용: 퀵 정렬, 합병 정렬, 이진 탐색 등
3) 동적 프로그래밍 방법 (Dynamic Programming)
가장 작은 부분 문제부터 해를 구해 저장(Memoization)해두고, 이를 이용해 큰 문제의 해를 구하는 상향식(Bottom-up) 접근 방식입니다.
- 특징: 작은 문제들이 서로 독립적일 필요가 없으며, 이미 계산된 해를 재사용하여 효율성을 높입니다.
다음 글에서는 시간복잡도, 점근성능 표기법, 순환 알고리즘과 점화식에 대해 작성해보겠습니다.
감사합니다.
'CS > 알고리즘' 카테고리의 다른 글
| 알고리즘 공부 시작! (0) | 2025.05.23 |
|---|