본문 바로가기

CS14

DFS와 BFS : (2) 구현하기 # 자료구조 복습 Stack Queue LIFO (Last In First Out) FIFO (First In First Out) 1. DFS 구현 1-1. DFS 과정 더이상 이어진 유효 노드가 없는 절벽 끝까지 쭉 탐색한다. 이때, 절벽 끝에 도달하고 나면, 스택에서 하나씩 다시 버리면서 왔던 길을 돌아가서 다른 길로 접어든다. 이후 탐색 반복 1-2. DFS 구현 코드 1 ) 재귀함수 이용 #include #include #include #include using namespace std; void dfs(int start, vector graph[], bool check[]) { check[start] = true; while(!st.empty()) { int current = st.top(); .. 2022. 8. 28.
DFS와 BFS : (1) 기초 1. DFS, BFS ? 그래프란, 정점(node)과 간선(edge)로 이루어진 자료구조이다. 이때, 우리는 그래프를 탐색함으로써 모든 정점을 한번씩 방문할 수 있다. 이러한 그래프 탐색 방법에는 깊이 우선 탐색과 너비 우선 탐색이 있다. DFS (Depth-First Search) BFS (Breadth-First Search) 깊이 우선 탐색 너비 우선 탐색 위 → 아래로 최대한 많이 내려간 다음, 더 이상 갈 수 없을 때 옆으로 이동 왼쪽 → 오른쪽으로 최대한 많이 옆으로 간 다음, 더 이상 갈 수 없을 때 아래로 이동 [구현] 스택 or 재귀함수 + 노드 방문 여부 배열 [구현] 큐 + 노드 방문 여부 배열 BFS보다 간단하지만, 탐색 속도 느림 DFS보다 복잡하지만, 탐색 속도 빠름 2. DFS.. 2022. 8. 28.
기수 정렬 (Radix Sort) 1. 기수 정렬 Queue를 이용해서 각 자리수 별로 정렬 반복 ※ 기 (radix) : 특정 진수를 나타내는 숫자들 ex ) 10진수의 radix : 0, 1, 2, 3, ....., 8, 9 2진수의 radix : 0, 1 2. 기수 정렬 예제 ex ) 89, 70, 35, 131, 910 오름차순 정리하시오. 2022. 6. 11.
Tree : 개념 정리 1. Tree : 그래프 중 cycle이 없는 형태 2. Terminology Node Tree 구성요소 Ancestor 한 node의 parent, grandparent 모두 Offspring node 한 node의 child, grandchild 모두 Root Node without Parents Subtree 하나의 node와 그 descendants로 구성된 tree Terminal node Node without children Non-terminal node Node with at least one child level tree의 layer 수 (3) height maximum level of the tree degree 그 node가 가진 child nodes의 수 3. Tree Type B.. 2022. 6. 7.
쉘 정렬 (Shell Sort) 1. 쉘 정렬 간격(gap)을 이용해서 굵직굵직한 삽입정렬을 하자 ※ 삽입정렬은 어느 정도 이미 정렬된 배열에서 효과적 ∴ 1. 간격을 이용해서 굵직굵직한 그룹별 삽입 정렬을 한다. (큰 숫자들 대충 뒤로, 작은 숫자들 대충 앞으로) 2. 큰 틀에서 어느정도 정렬이 된 상태가 된다. 3. 이후에 정석 삽입정렬을 해서 완벽히 정렬 ※ gap 전체 원소 수의 1/2 → 이전 gap의 1/2 → 이전 gap의 1/2 → ...... → 1 2. 쉘 정렬 예제 ex ) 30 60 90 10 40 80 40 20 10 60 50 30 40 90 80 오름차순 정리하시오. #include void shellSort(int arr[], int len) { for(int h=len/2 ; h>0 ; h/=2) { fo.. 2022. 6. 6.
퀵 정렬 (Quick Sort) 1. 퀵 정렬 ▶ 분할정복 알고리즘 input 배열을 반복적으로 분할해서 계산하는 알고리즘이며, 평균 시간복잡도가 O(N*logN) 특정한 값 a을 기준으로 a보다 큰 수, a보다 작은 수를 나누자 ! ※ 특정한 값 a = pivot ※ 일반적으로 첫번째 원소를 pivot 값으로 설정한다. 2. 퀵 정렬 예제 ex ) 3 7 8 1 5 9 6 10 2 4 오름차순 정리하시오. #include int number = 10; int data[10] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 }; void show() { for (int i = 0; i < number; i++) { printf("%d ", data[i]); } } void quickSort(int* a, int start,.. 2022. 5. 9.
삽입 정렬 (Insertion Sort) 1. 삽입 정렬 각 숫자를 적절한 위치에 삽입하자 ! ※ 한번 수행할 때마다 [앞] 정렬된 부분의 원소 수가 1개 증가, [뒤] 정렬 안된 부분의 원소 수는 1개 감소됨 반복해서 수행하면 결국 [뒤] 정렬 안된 부분에는 아무 원소도 남지 않고 모두 정렬됨 ※ 선택/버블 vs. 삽입 ▶ 선택, 버블: 이미 알맞게 정렬되어 있더라도 차례가 되면 정렬당함 (위치 바꾸는 과정 거침) : 비효율적 ▶ 삽입: 필요할때만 위치를 바꿈 : 효율적 이번 주자 앞에 있는 애들은 다 이미 알맞은 위치에 정렬되어 있는 상태이므로 다시 정렬할 필요 없음 2. 삽입 정렬 예제 ex ) 1 10 5 8 7 6 4 3 2 9 오름차순 정리하시오. #include int main(void) { int a[] = { 1, 10, 5, .. 2022. 5. 6.
버블 정렬 (Bubble Sort) 1. 버블 정렬 2개씩 비교해서 더 작은 것을 앞으로 자리바꿈 * 세로로 그려 보면, 가장 작은 것이 거품처럼 위로 (=맨 앞으로) 올라가는 형태 [ Algorithm ] 1. for pass = 1 to n-1 2. for i = 1 to n-pass 3. if (A[i-1] > A[i]) // 위의 원소가 아래의 원소보다 크면 4. A[i-1] ↔ A[i] // 자리바꿈 5. return A 2. 버블 정렬 예제 ex ) 1 10 5 8 7 6 4 3 2 9 오름차순 정리하시오. #include int main(void) { int a[] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 }; int n = sizeof(a) / sizeof(int); int temp; for (int i .. 2022. 5. 4.
선택 정렬 (Selection Sort) 1. 선택 정렬 가장 작은 것을 맨 앞으로 가져오자 ! 2. 선택 정렬 예제 ex ) 1 10 5 8 7 6 4 3 2 9 오름차순 정리하시오. #include int main(void) { int a[] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 }; int min, minIdx, temp; int n = sizeof(a) / sizeof(int); for (int i = 0; i < n-1; i++) { min = a[i]; minIdx = i; for (int j = i + 1; j < n; j++) { if (a[j] < min) { min = a[j]; minIdx = j; } } temp = a[i]; a[i] = a[minIdx]; a[minIdx] = temp; } for.. 2022. 5. 3.