본문 바로가기

CS36

DFS와 BFS : (1) 기초 1. DFS, BFS ?그래프란, 정점(node)과 간선(edge)로 이루어진 자료구조이다. 이때, 우리는 그래프를 탐색함으로써 모든 정점을 한번씩 방문할 수 있다.이러한 그래프 탐색 방법에는 깊이 우선 탐색과 너비 우선 탐색이 있다.  DFS (Depth-First Search)BFS (Breadth-First Search)깊이 우선 탐색너비 우선 탐색위 → 아래로 최대한 많이 내려간 다음, 더 이상 갈 수 없을 때 옆으로 이동왼쪽 → 오른쪽으로 최대한 많이 옆으로 간 다음, 더 이상 갈 수 없을 때 아래로 이동스택 or 재귀함수  +  노드 방문 여부 배열큐 +  노드 방문 여부 배열BFS보다 간단하지만, 탐색 속도 느림DFS보다 복잡하지만, 탐색 속도 빠름   2.  DFS, BFS  활용 가능한 .. 2022. 8. 28.
[Node.js] node.js 관련 개념 [출처]  Node.js 교과서 (조현영) 1. 서버란 ?네트워크를 이용하여 클라이언트에게 데이터나 서비스를 제공하는 컴퓨터나 프로그램= 클라이언트(브라우저, 모바일 어플, 서버 등)의 요청에 응답   2. Node.js의 특성2-1. JavaScript RunTimeNode.js는 공식 문서에  자바스크립트 런타임이라고 소개되고 있다. 이때, Runtime은 어떤 언어로 작성된 프로그램이 실행될 수 있는 환경을 의미한다. 즉, node.js는 자바스크립트 실행기라고 이해하면 된다.▷ RunTime : 특정 언어로 만든 프로그램을 실행할 수 있는 환경  2-2. 이벤트 기반  event-driven▷ 이벤트 기반 : 어떤 이벤트가 발생하면, 사전에 지정해둔 작업을 실행하는 방식▷ 이벤트 루프 (loop).. 2022. 6. 29.
기수 정렬 (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 = end) { // 원소가 1개인 경우 return; } int key = start; // k.. 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.