CS 41

깊이우선 탐색(DFS)와 너비우선 탐색(BFS), 응용 ; 연결 성분 찾기

그래프 탐색 : 그래프의 기본 연산 중 하나. 하나의 정점으로부터 시작해 차례대로 모든 정점들을 한 번씩 방문. 특정 정점에서 특정 정점까지 갈 수 있는지 없는지를 탐색 1. 깊이우선 탐색(DFS) ○ 개념 : 임의의 한쪽 방향으로 갈 수 있을 때까지 가다가 더 이상 갈 수 없게 되면 가장 가까운 갈림길로 돌아와서 그곳으로부터 다른 방향으로 다시 탐색을 진행. 갈림길로 다시 돌아가는 과정에서는 스택을 사용하거나 재귀 함수 호출을 이용. ○ 알고리즘 : 정점 v를 방문한 후 해당 정점이 방문되었다고 표시하고 v의 모든 인접 정점에 대해 방문되지 않은 정점이라면 재귀 함수 호출. ○ 프로그램 int visited[8]; vector adj_list[8]; //adj_list[i]에는 i의 인접 정점들의 리스..

CS/알고리즘 2021.03.31

그래프의 개념과 종류, 구현

그래프 -> 연결되어 있는 객체 간의 관계를 표현하는 자료구조. 가장 일반적인 자료구조의 형태로 트리, 이진트리도 그래프의 특수한 경우. 선수과목 관계, 도로망, 영역간 인접 관계 등을 표현할 수 있음. ▷ 개념 · 그래프 G는 ( V,E )로 표시. 특별한 언급이 없으면 그래프는 자가 루프와 중복 에지가 없는 단순 그래프를 의미. · 정점(vertex) V(G) : 그래프 G의 정점들의 집합. 여러 가지 특성을 가질 수 있는 객체를 의미하며 노드라고도 불림. · 에지(edge) E(G) : 그래프 G의 에지들의 집합. 정점들 간의 관계를 의미하며 간선 또는 링크라고도 불림. · 인접 정점(adjacent vertex) 어떤 정점에서 에지에 의해 직접 연결된 정점 · 경로(path) 정점 s로부터 정점 ..

CS/자료구조(DS) 2021.03.30

우선순위 큐의 개념과 구현, 힙의 구현과 응용; 힙정렬

우선순위 큐(priority queue) -> 우선순위를 가진 원소들을 저장하는 큐. 들어온 순서에 상관없이 가장 우선순위가 높은 항목이 삭제됨. 스택이나 FIFO 큐도 우선순위 큐의 특별한 형태라고 볼 수 있음. 최소(min) 우선순위 큐와 최대(max) 우선순위 큐 존재. ▷ ADT create() :: = 우선순위 큐를 생성 init(pq) :: = 우선순위 큐 pq를 초기화 is_empty(pq) :: = 우선순위 큐 pq가 비어있는지 검사 is_full(pq) :: = 우선순위 큐 pq가 가득 찼는지 검사 insert(pq, x) :: = 우선순위 큐 pq에 원소 x를 추가 (x값을 우선순위라고 가정) deleteMin(pq) :: = 우선순위 큐 pq로부터 가장 우선순위가 높은 원소를 삭제하고..

CS/자료구조(DS) 2021.03.29

이진트리의 성질, 운행과 응용; 수식표현 트리, 이진트리로의 변환법, 이진탐색트리

트리 -> 부모-자식 관계의 노드들로 이루어진, 계층적인 관계를 나타내는 특별한 자료구조(비선형 리스트). ▷ 용어 · 노드 : 데이터, 정보가 저장된 트리의 구성 원소 · 에지(간선) : 노드와 노드 사이를 나타내는 구성 원소 · 루트 : 부모가 없는 노드, 최상단 노드 · 리프 : 자식이 없는 노드, 단말 노드 · 레벨 : 트리의 각 층의 번호(루트의 레벨은 0 또는 1) · 높이(깊이) : 트리의 최대 레벨 · 차수 : 노드가 가지고 있는 자식 노드 개수 이진트리 -> 공집합이거나, 공집합이 아닌 경우 특별히 지정된 노드인 루트가 있고, 각 노드는 최대 2개의 자식 노드가 존재하며, 각 노드가 왼쪽 부분트리 및 오른쪽 부분트리를 가짐. ▷ 분류 · 포화 이진트리(full binary tree) : ..

CS/자료구조(DS) 2021.03.24

큐의 구현과 응용; 덱(deque)

큐 -> 먼저 들어온 항목이 먼저 나가는 특수한 선형 리스트, 선입선출(FIFO) 구조. ○ 큐 ADT enqueue(q, item) :: = 새로운 원소 item을 큐 q에 삽입 dequeue(q) :: = 큐가 비어있지 않으면 큐 q에서 원소 삭제 후 반환 peek(q) :: = 큐가 비어있지 않으면 큐 q에서 원소 삭제하지 않고 원소 값만 반환 is_empty(q) :: = 큐가 비어있으면 true, 아니면 false를 반환 is_full(q) :: = 큐가 가득 차 있으면 true, 아니면 false를 반환 size(q) :: = 큐에 있는 원소의 개수를 반환 (length(q)) visit(q) :: = 큐에 있는 모든 원소 출력 (display(q), print(q)) ○ 배열을 이용한 큐 ·..

CS/자료구조(DS) 2021.03.22

스택의 구현과 응용; 괄호 검사, 수식 계산

스택 -> 삽입과 제거가 한쪽 끝에서만 이루어지는 특수한 선형 리스트. 후입선출(LIFO) 구조. ○ 스택 ADT create(s) :: = 스택 s를 생성한다. is_empty(s) :: = 스택 s가 비어있는지를 검사한다. is_full(s) :: = 스택 s가 가득 찼는가를 검사한다. push(s,e) :: = 스택 s에 원소 e를 삽입한다. pop(s) :: = 스택 s에서 가장 최근에 삽입된 원소(top 위치에 있는 원소)를 삭제하면서 그 값을 반환한다. peek(s) :: = 스택 s에서 가장 최근에 삽입된 원소(top 위치에 있는 원소)의 값을 반환한다. ○ 스택의 구현 · 배열을 이용한 스택의 구현 : 1차원 배열 stack[], 가장 최근에 입력되었던 자료를 가리키는 변수 top. 공백상..

CS/자료구조(DS) 2021.02.16

기본 자료 구조; 리스트의 구현

○ 리스트 ADT add_last(list,item) :: = 리스트의 맨끝에 원소를 삽입한다. (insert()) add_first(list,item) :: = 리스트의 처음에 원소를 삽입한다. add(list,pos,item) :: = pos 위치에 원소를 삽입한다. delete(list, pos) :: = pos 위치의 원소를 제거한다. delete(list,item) :: = 리스트에서 원소 item을 제거한다. clear(list) :: = 리스트의 모든 원소를 제거한다. (erase()) is_in_list(list,item) :: = item이 리스트 안에 있는지 검사한다. (member()) get_entry(list,pos) :: = pos 위치의 원소를 반환한다. (return()) g..

CS/자료구조(DS) 2021.02.15

기본 자료구조; 연결 리스트

연결 리스트 : 여러 노드들의 연결로 이루어진 리스트. 각 노드는 데이터 값을 저장하는 데이터 필드와 다른 노드의 주소값을 저장하는 링크 필드로 이루어져 있다. 노드의 삽입과 삭제가 용이하며 연속된 메모리 공간이 필요하지 않고 배열에 비해 크기 제한이 없다는 장점과 다소 구현이 어렵다는 단점이 있다. ▷ 연결 리스트의 종류 - 단순 연결리스트 : 하나의 링크 필드를 이용해 연결. 마지막 노드의 링크 값은 NULL. · 단순 연결 리스트 생성 : ListNode 구조체 생성, 동적 메모리를 할당 받아 연결 리스트 생성 //단순 연결 리스트 구현 typedef int element; typedef struct ListNode{ element data; struct ListNode *link; } ListNo..

CS/자료구조(DS) 2021.02.15

기본 자료구조; 배열의 개념과 응용(다항식 구현)

배열이란? -> 일반적으로 같은 형의 변수를 여러 개 만드는 경우에 사용. ˙ 개념 int A[6]; //1차원 배열 char s[12] = "game over" //문자열, terminating null character인 '\0'을 포함. int A[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}} //2차원 배열, 행 우선. int A[3][3][3]; //3차원 배열 * 2차원 배열에서의 실제 주소 구하기 : 2차원 정수 배열 A[m][n]에서 A[j][k]의 실제 주소 = base + ( j x n + k ) x sizeof(int) * 3차원 배열에서의 실제 주소 구하기 : 3차원 실수 배열 A[l][m][n]에서 A[i][j][k]의 실제 주소 = base + ..

CS/자료구조(DS) 2021.02.05

재귀와 반복 ; 팩토리얼, 피보나치수

재귀(recursion) : -> 함수가 자기 자신을 다시 호출하는, 재귀 호출을 이용하는 방법. 불필요한 호출을 하게 되는 경우가 있음. 반복(iteration) : -> for문, while문, repeat문 등의 반복문을 이용. 재귀보다 수행속도가 빠르고 효율적이지만 문제 자체가 재귀적인 경우에는 프로그램 작성이 어려울 수 있음. but, 대부분의 재귀는 반복문을 사용해 작성할 수 있음. 1. 팩토리얼 함수 - 반복적 정의와 프로그램 n! = 1 if n = 0 n! = n x ( n - 1 ) x ( n - 2 ) x ··· x 1 if n > 0 int factorial_iter(int n) { int i, fact = 1; for (i=n; i>0; i--) fact = fact * i; re..

CS/자료구조(DS) 2021.02.04