알고리즘
알고리즘은 어떤 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것으로,
문제풀이에 필요한 계산절차 또는 처리과정의 순서를 의미한다
알고리즘의 중요한 특징은 같은 지식수준을 가진 사람이라면 그 알고리즘을 보고 누구나 같은 결과를 낼 수 있어야한다
알고리즘의 조건
- 입력: 외부에서 제공되는 자료가 0개 이상 존재한다
- 출력: 적어도 2개 이상의 서로다른 결과를 내어야 한다 (모든 입력에 하나의 출력이 나오면 안된다)
- 명확성: 수행 과정은 명확하고 모호하지 않은 명령어로 구성되어야 한다
- 유한성: 유한 번의 명령어를 수행 후 유한 시간 내에 종료한다
- 효율성: 모든 과정은 명백하게 실행 가능(검증 가능)한 것이어야 한다
좋은 알고리즘의 기준
- 정확성: 적당한 입력에 대해 유한 시간내에 올바른 답을 산출하는가를 판단
- 작업량: 전체 알고리즘에서 수행되는 가장 중요한 연산들만으로 작업량을 측정
- 기억장소 사용량: 수행에 필요한 저장 공간을 적게 사용
- 최적성: 더 적은 연산을 수행하는 알고리즘
- 복잡도 (점근 표기법 (Big-O Notation)): 알고리즘이 소모하는 소요시간과 메모리 사용량
알고리즘의 분류
- 정렬 (sort)
- 탐색 (Search)
- 그래프 (Graph)
알고리즘 문제 해결 전략
- 재귀 호출
함수 안에서 해당 함수가 호출되는 형태
- 동적 계획법
하나의 큰 문제를 해결하기 위해서 큰 문제를 작은 문제로 나누어 해결한 후 작은 문제로부터 계산된 결과 값을 이용하여 전체 문제를 해결
> 상향식 접근법 (가장 최하위 문제의 답을 구한 후 이를 이용하여 상위 문제를 풀어나가는 방식)
> 메모이제이션 (프로그램 실행 시 중복되는 연산이 2번 실행되지 않도록 이전에 계산한 값을 저장하여 전체적인 연산 실행 속도를 빠르게 하는 기술)
- 분할 정복
하나의 큰 문제를 해결하기 위해 작은 문제로 나누어 하위 문제를 해결하고 다시 병합하여 상위 문제의 답을 얻는 방식
> 하향식 접근법 (상위 문제의 답을 구하기 위해 아래로 내려가면서 하위 문제의 답을 먼저 구하는 방식. 재귀함수로 구현)
> 동적계획법과 달리 나누어진 부분 문제에 중복이 없음
- 탐욕 알고리즘
최적의 해에 가까운 값을 구하기 위해 사용하는 알고리즘
여러가지 경우 중 하나를 결정해야할 때 상황에 따라 매순간 최선의/최적의 선택을 하여 최종적인 값을 구하는 방식
- 백트래킹 (퇴각 검색)
제약조건 만족 문제에서 해를 찾기 위한 전략
해를 찾기 위해서 어떤 후보군을 대상으로 제약조건을 체크하다가 해당 후보군이 제약조건을 만족할 수 없다고 판단되면 그 즉시 backtrack(다시는 해당 후보군을 체크하지 않을 것을 표시)한 후, 다른 후보군으로 넘어가는 방식
백트래킹에 의해 연산의 대상이 되는 후보군이 적어지고 그만큼 시간복잡도가 크게 줄어들어 빠르게 최적의 해를 구할 수 있다
정렬 - 버블 정렬
서로 인접해있는 요소 간의 대소 비교를 통해 정렬
가장 단순한 알고리즘으로 단순한 만큼 비효율적이다
- 시간 복잡도
최고, 평균, 최악 모두 O(n^2)
- 공간 복잡도
하나의 배열만 사용하여 O(n)

정렬 - 삽입 정렬
정렬을 진행할 원소의 index 보다 낮은 곳에 있는 원소들을 탐색하여 알맞은 위치에 삽입
낮은 원소를 탐색해야하기 때문에 두번 째 index 부터 시작
알고리즘이 동작하는 동안 계속해서 정렬이 진행되기 떄문에 반드시 맨 왼쪽까지 탐색하지 않아도 된다는 장점이 존재
- 시간 복잡도
O(n)
- 공간 복잡도
O(n)

정렬 - 선택 정렬
배열에서 최소 값을 반복적으로 찾아 정렬
- 시간 복잡도
최선, 평균, 최악 모두 O(n^2)
- 공간 복잡도
O(n)

정렬 - 퀵 정렬
분할 정복법과 재귀를 사용해 정렬
정렬될 기준 원소를 뜻하는 피봇 (pivot)이라는 개념을 사용
피봇 선택 방법에 따라 퀵 정렬의 성능이 달라지는데, 최적의 피봇 선택이 어려우므로 임의 선택을 해야함
보통 배열의 첫 번째 값이나 중앙 값을 선택

정렬 - 병합 정렬
분할정복과 재귀 알고리즘을 사용
퀵 정렬과 함께 두 개의 알고리즘이 사용된다는 측면에서 공통점을 가짐
그러나 퀵 정렬과 달리 배열을 원소가 하나만 남을때까지 이분할 한 다음 대소 관계를 고려하여 재배열하여 원래 크기의 배열로 병합

정렬 - 힙 정렬
힙이란 트리 기반의 자료구조로, 두개의 노드를 가진 완전 이진 트리를 의미
따라서 힙 정렬은 완전 이진 트리를 기반으로 하는 정렬 알고리즘
힙은 최대 힙과 최소 힙으로 나누며, 최대 힙은 내림차순 정렬에, 최소 힙은 오름차순 정렬에 사용


정렬 - 셸 정렬
삽입 정렬의 단점을 보완하기 위해 도입된 알고리즘
주어진 정렬 상태가 역순으로 배열되어 있을 수록 비교횟수가 늘어남
간격(interval)이라는 개념을 사용하며 간격은 비교할 원소 간의 간격을 의미
비교 횟수를 줄이기 위해 interval은 큰 값에서 작은 값으로 낮춰짐
- 시간 복잡도
평균 O(n^1.25~1.5)
정렬 - 기수 정렬
non-comparison 알고라즘으로 원소간의 대소 비교를 하지 않고 정렬
정렬하고자 하는 수의 낮은 자리 수를 차례대로 확인하여 정렬
정렬을 위해 총 10개의 queue를 사용

정렬 - 카운팅 정렬
이름 그대로 배열에 존재하는 원소 별 개수를 세어 정렬하는 방식
버블, 선택, 힙, 병합, 퀵, 삽입 알고리즘의 시간 복잡도를 O(n) 수준으로 낮추기 위해 도입

탐색 - 이진 탐색
탐색할 자료를 반으로 나누어 찾는 데이터가 있을만한 곳을 탐색

탐색 - 순차 탐색
데이터가 담겨있는 리스트를 앞에서부터 하나씩 순차적으로 비교하여 원하는 데이터를 탐색

그래프 - 너비 우선 탐색 (BFS)
노드와 같은 레벨에 있는 노드(형제노드)를 먼저 탐색하는 방식

그래프 - 깊이 우선 탐색 (DFS)
노드의 자식 노드를 먼저 탐색하는 방식

그래프 - 최단 경로 알고리즘
그래프에서 두 노드를 잇는 가장 짧은 경로를 찾는 알고리즘
간선의 가중치 합이 최소인 경로를 찾는 것을 목적으로함
- 단일 출발
특정 노드와 그 외 노드 간의 최단 경로
- 단일 출발 및 단일 도착
특정 노드 2개의 최단 경로
- 전체 쌍
모든 노드 간의 연결 조합에 대한 최단 경로
그래프 - 다익스트라 알고리즘
최단 경로 알고리즘에서 단일 출발에 해당
첫 정점을 기준으로 연결되어 있는 인접노드를 추가해가며 최던 거리를 갱신

그래프 - 최소 신장 트리 알고리즘 (MST)
신장트리 (그래프 내부의 모든 노드가 연결되어 있으며 사이클이 없는 그래프) 중에서 간선의 가중치 합이 가장 작은 경로로 이루어진 트리

그래프 - 크루스칼 알고리즘
대표적인 최소 신장 트리 알고리즘으로, 탐욕 알고리즘을 기반하여 선택과 결정을 수행
모든 간선의 가중치를 오름차순으로 정렬 후 가장 낮은 가중치를 갖는 간선부터 모든 노드를 연결하며 MST를 탐색
사이클의 유무를 판단하기 위해 Union-Find 알고리즘을 사용


그래프 = 프림 알고리즘
크루스칼 알고리즘과 마찬가지로 대표적인 최소 신장 트리 알고리즘이며 탐욕 알고리즘을 기반으로 함
어떤 노드와 인접한 노드의 간선만을 대상으로 하여, 인접 노드 중에서 간선의 가중치가 가장 작은 간선을 선택하여 해당 인접 노드를 연결하는 방식으로 MST를 탐색



Reference
[알고리즘] 알고리즘 #0 - 알고리즘이란? 종류와 의미
Alogorithm(알고리즘) 어떠한 문제를 해결하기 위한 일련의 절차를 공식화한 형태로 표현한 것 프로그래밍에서 알고리즘은 input 값을 통해 output 값을 얻기 위한 계산 과정문제를 해결할 때, 정확
coffeebaralog.tistory.com
[자료구조] 기본 정렬 알고리즘 총 정리
1. 버블 정렬 (Bubble Sort) 버블정렬은 서로 인접해 있는 요소 간의 대소 비교를 통해 정렬한다. 버블 정렬은 정렬 알고리즘 중 가장 단순한 알고리즘으로, 단순한 만큼 비효율적이다. 시간 복잡도
roytravel.tistory.com
'Development > Development' 카테고리의 다른 글
도메인 설계의 함정 (DDD, Domain Driven Design) (0) | 2025.03.18 |
---|---|
오픈소스 문서를 작성하며 깨달은 것들 (0) | 2025.03.18 |
공간 복잡도, 시간 복잡도에 대해 알아보자 (feat. Big-O) (0) | 2025.02.18 |
자료구조 종류 총 정리 (0) | 2025.02.16 |
Rust 란? (1) | 2025.02.10 |