본문 바로가기

알고리즘(Algorithm)

(19)
[자료구조] 그래프 그래프 그래프는 요소들이 서로 연결되어 있는 관계를 표현한 자료구조이다. 그래프는 정점(vertex)와 그들을 연결하는 간선(edge)의 집합으로 구성된다. 수학적으로는 다음과 같이 표시한다. (\G = (V, E)\) \(V(G)\)는 그래프 \(G\)의 정점의 집합, \(E(G)\)는 그래프 \(G\)의 간선의 집합 정점 A와 정점 B가 있다고 하면, 두 정점을 이어주는 간선은 (A, B)와 같이 정점의 쌍으로 나타낸다. 그래프는 정점과 간선의 집합이기 때문에, 한 그래프를 그리는 방법은 다양하다. 무방향 그래프(undirected graph) 간선에 방향이 표시되지 않은 그래프이다. 두 정점 A, B에 대하여 간선 (A, B)와 (B, A)는 동일한 간선이 된다. 현실의 것과 비유하자면, 지하철 노..
[알고리즘] 이진 탐색 트리 컴퓨터에서 탐색은 레코드(record)의 집합에서 특정한 레코드를 찾아내는 작업을 뜻한다. 레코드는 하나 이상의 필드(field)로 구성된다. 예를 들어, 한 학생의 정보를 구조체로 저장한다면, 구조체가 레코드고 이름, 학번, 학과 등등이 필드가 된다. 레코드를 서로 구별하기 위해서는 필드들 중에서 서로 중복되지 않는 고유한 값이 필요한데, 이를 키(key)라고 한다. 이진 탐색 트리는 다음과 같은 특징을 지니는 이진 트리이다. 1. 이진 탐색 트리의 각 노드는 키 값을 하나씩 가진다. 또한 각 노드의 키 값은 달라야한다. 2. 최상위 레벨에는 루트 노드가 있고, 각 노드는 최대 두 개의 자식 노드를 가진다. 3. 각 노드의 키 값은 왼쪽에 있는 모든 노드의 키 값보다 크고, 오른쪽에 있는 모든 노드의 ..
[알고리즘] 선형 시간 선택 알고리즘 10개의 원소를 갖는 아래와 같은 배열이 있다. 이 배열에서 i번째의 값을 찾는다고 해보자. arr[10] = { 10, 2, 5, 7, 6, 4, 8, 1, 9, 3 } 우선 배열을 한 번씩은 다 훑어봐야 하므로 적어도 n에 비례하는 시간이, 즉 \(\Omega(n)\)이 될것이다. 정렬을 한다면 \(O(nlogn)\)일 것이다. 어떤 시간에서든 선형 시간에 가능하도록 보장해줄 수 있도록 하는 알고리즘이 없을까? 이를 가능하도록 하는 알고리즘이 바로 선형 시간 선택 알고리즘이다. 평균 선형 시간 선택 알고리즘 선택 알고리즘은 퀵 정렬에서 사용했던 분할 알고리즘을 사용한다. 위의 경우에서 분할 알고리즘을 사용한다면 i번째 값을 찾을 수 있다. 기준원소를 5로 하고, 3번째로 작은 원소를 찾는다고 해보자...
[알고리즘] 정렬(3) - 기수 정렬, 카운팅 정렬 \(\Theta(n^2)\)와 \(\Theta(nlogn)\)이 소요되는 정렬 알고리즘들을 알아봤다. 이번에는 특수한 상황에서 사용할 수 있는 알고리즘을 살펴보겠다. 기수 정렬(Radix Sort) 기수 정렬이란 입력이 모두 k 자릿수 이하의 자연수인 경우에 사용할 수 있는 알고리즘이다. 가장 낮은 자릿수만으로 수를 정렬한 뒤, 다음 자릿수로 정렬, ... 를 반복해서 정렬된 배열을 얻는 방법이다. 이때, 같은 수라면 먼저 들어간 수가 위로 정렬된다. C++로 구현한 기수 정렬 const int PLACE_VALUE = 10; const int DIGIT = 2; void radix_sort(int* arr, int start, int end) { std::queue k[PLACE_VALUE]; // 자..
[알고리즘] 정렬(2) - 병합 정렬, 퀵 정렬, 힙 정렬 앞에서는 시간 복잡도가 \(\Theta(n^2)\)인 정렬 알고리즘들을 알아봤다. 이번에는 \(\Theta(nlogn)\)인 알고리즘들을 알아보자. 병합 정렬(Merge Sort) 병합 정렬은 먼저 입력을 절반으로 나눈다. 이후 그 두 덩이를 각각 정렬한 뒤, 서로 합쳐서 정렬하는 방식이다. 나뉘어진 두 덩어리도 다시 반으로 나눈 뒤 정렬하고 병합하고, 또 그 나누어진 덩이를 나누는 과정을 반복한다. 즉, 정렬 과정을 재귀적으로 반복하는 방법이다. 3 2 4 1 우선 절반을 가른다. 3 2 4 1 각각을 또 절반으로 가른다. 3 2 4 1 왼쪽과 오른쪽에서 자른 덩어리를 합하며 정렬한다. 2 3 1 4 나머지 덩어리를 합하며 정렬한다. 1 2 3 4 정렬이 끝난 배열 1 2 3 4 C++로 구현한 병합정..
[자료구조] 우선순위 큐와 힙 우선순위 큐(Priority Queue) 우선순위 큐의 큐는 먼저 들어온 데이터가 먼저 나가는, 그 큐가 맞다. 둘의 차이점이라면, 우선순위 큐는 우선순위가 높은 데이터가 먼저 출력되는 것이 차이다. 아래와 같은 배열이 있다고 하자. Array arr[10] = { 1, 3, 4, 9, 6, 2, 7, 8, 10, 5 }; Priority_Queue pq[10]; 이 배열을 우선순위 큐(pq)에 저장된다고 하자. 큰 수에 우선순위가 주어진다고 하면, pq에는 아래와 같이 저장된다. Priority_Queue pq[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 입력은 1, 3, 4, ..., 10, 5 순으로 되었지만, 우선순위 큐에는 큰 수부터 나열되어있다. 즉, 높은 우선순위..
[자료구조] 트리 트리 트리는 스택, 큐 등의 선형적인 자료구조가 아니라, 계층적인 구조의 자료구조이다. 컴퓨터의 폴더 구조, 가계도, 회사의 조직도 등 계층적인 관계들을 표현한 자료구조이다. 이 외에도 인공지능에서 사용되는 결정 트리도 트리라고 할 수 있겠다. 트리는 위의 그림과 같이, 1개 이상의 노드로 이루어져 있다. 트리 용어 노드(Node) : 트리를 구성하는 요소들로 그림에서 A, B, C, D, E, F, G, H, I 를 말한다. 루트(Root) 노드 : 트리에서 가장 높은 곳에 있는 노드. 위 그림에서 A가 루트 노드이다. 서브 트리(Subtree) : 루트 노드에서 갈라져 나온 트리. 간선(Edge) : 루트와 서브트리 사이에 연결된 선. 부모 노드(Parent node) : 자식 노드와 직접 연결된 상..
[알고리즘] 정렬(1) - 선택 정렬, 버블 정렬, 삽입 정렬 정렬은 정해진 순서대로 나열하는 것이다. 학교에 처음 갔을 때 키 순서대로 자리를 배치하는 것이 좋은 예이다. 컴퓨터에서 정렬 알고리즘은 시간 복잡도가 Θ(\(n^2\))인 것 부터, Θ(\(nlogn\)), Θ(\(n\))등 여러가지 알고리즘이 있다. 각각의 알고리즘들을 알아보면서 직접 구현하는 시간을 가져보겠다. 모든 예시코드에는 공통적으로 아래의 배열을 예시로 정렬 알고리즘을 구현할 것이다. const int SIZE = 10; int arr[SIZE] = { 6, 2, 9, 7, 3, 10, 4, 1, 8, 5 }; 선택 정렬(Selection Sort) 가장 큰 원소를 찾은 후, 맨 뒷자리에 있는 원소와 자리를 바꾸는 정렬 알고리즘이다. 가장 큰 원소의 이동이 끝나면, 다음으로 큰 원소를 마지막..