good_da22 's devLog

algorithm 16

위상 정렬 (Topology Sort)

위상 정렬 (Topology Sort) 유향 그래프의 정점들을 방향을 거스르지 않도록 나열하는 것을 의미 위상 정렬은 순서가 정해져 있는 작업들을 차례대로 수행해야 할 때, 그 순서를 결정해주는 알고리즘 ex) 교육과정의 선수과목 구조 만약 특정 수강 과목에 선수 과목이 있다면 그 선수 과복부터 수강해야하므로, 특정 과목들을 수강해야 할 때 위상 정렬을 통해 올바른 수강 순서를 찾아낼 수 있다. 선후 관계가 정의된 그래프 구조 상에서 선후 관계에 따라 정렬하기 위해 위상 정렬 이용 가능 정렬 순서는 유향 그래프의 구조에 따라 여러 개의 종류가 나올 수 있다. 위상 정렬이 성립하기 위해서는 반드시 그래프의 순환이 존재하니 않아야 한다. 그래프가 비순환 유향 그래프(directed acyclic graph)..

최소 신장 트리 (Minimum Spanning Tree)

최소 신장 트리 (Minimum Spanning Tree) 신장 트리 - n개의 정점으로 이루어진 무향 그래프에서 n개의 정점과 n-1개의 간선으로 이루어진 트리 최소 신장 트리 -무향 가중치 그래프에서 신장 트리를 구성하는 간선들의 가중치의 합이 최소인 신장 트리 무향 그래프, 가중치를 가진 그래프에서 만들 수 있다. Krusakal 알고리즘 간선을 하나씩 선택해서 MST를 찾는 알고리즘 간전 중심 표현 그래프 간선 리스트 사용 최초, 모든 간선을 가중치에 따라 오름차순dmfh wjdfuf 가중치가 가장 낮은 간선부터 선택하면서 트리를 증가 사이클이 존재하면 다음으로 가중치가 낮은 간선 선택 n-1개의 간선이 선택될 때까지 2를 반복 // G.V : 그래프의 정점 집합 // G.E : 그래프의 간선 집..

그래프 (Graph)

그래프 (Graph) 그래프는 아이템(사물 또는 추상적 개념)들과 이들 사이의 연결 관계로 표현한다 정점(Vertex) : 그래프의 구성요소로 하나의 연결점 간선(Edge) : 두 정점을 연결하는 선 차수(Degree) : 정점에 연결된 간선의 수 그래프는 정점(Vertex)들의 집합과 이들을 연결하는 간선(Edge)들의 집합으로 구성된 자료 구조 V : 정점의 개수, E : 그래프에 포함된 간선의 개수 V 개의 정점을 가지는 그래프는 최대 V * (V-1) / 2 개의 간선이 가능(무향 그래프, 양방향) 선형 자료구조나 트리 자료구조로 표현하기 어려운 N : N 관계를 가지는 원소들을 표현하기 용이하다. 트리는 계층형 관계와 1:N 관계를 나타내는 특수한 그래프 형태 그래프 유형 무향 그래프(Undir..

서로소 집합(Disjoint Set)

서로소 집합(Disjoint Set) 서로소 또는 상호배타 집합들은 서로 중복 포함된 원소가 없는 집합들 다시 말해 교집합이 없다. 집합에 속한 하나의 특정 멤버를 통해 각 집합들을 구분, 이를 대표자(representative)라 한다. 서로소 집합을 표현하는 방법 - 집합 구성요소(원소) 표현 연결 리스트 트리 서로소 집합 연산 Make-set(x) : 집합 생성(x원소(대표자)를 가지는) Find-set(x) : x가 속한 집합 찾기 Union(x, y) : x와 y 원소를 하나의 집합으로 만들기 (대표자끼리 합친다) 서로소 집합 표현 - 연결 리스트 같은 집합의 원소들은 하나의 연결리스트로 관리한다. 연결리스트의 맨 앞의 원소를 집합의 대표 원소로 삼는다. 각 원소는 집합의 대표원소를 가리키는 링..

백트래킹 (backtracking)

백트래킹 (backtracking) 퇴각 검색 모든 조합을 시도해서 문제의 해를 찾는다. -> 완전 탐색 해를 얻을 때까지 모든 가능성을 시도한다. 모든 가능성은 하나의 트리(상태 공간 트리)6처럼 구성할 수 있으며, 가지(선택지) 중에 해결책이 있다. 여러 가지(선택지)들이 존재한는 상황에서 하나의 가지를 선택한다. 선택이 이루어지면 새로운 선택지들의 집합이 생성된다. 이런 선택을 반복하면서 최종 상태에 도달한다. 보통 재귀 함수로 구현된다. N - Queen 문제 완전 탐색할 경우 수 많은 후보 해 중에서 유망하지 않은 해는 방문하지 않는다. 당첨 리프 노드 찾기 루트에서 갈 수 있는 노드를 선택한다. 꽝 노드까지 도달하면 최그늬 선택으로 되돌아와서 다시 시작한다. 더 이상 선택지가 없다면 이전의 선..

스택(stack) / 큐(queue)

스택 (stack) 물건을 쌓아 올리듯 자료를 쌓아 올린 형태의 자료구조 스택에 저장된 자료는 선형 구조를 갖는다. 선형 구조 : 자료 간의 관계가 1대 1의 관계를 갖는다. 비선형 구조 : 자료간의 관계가 1대 N관계를 갖는다. ex) 트리 스택에 자료를 삽입하거나 자료를 꺼낼 수 있다. 후입선출구조(LIFO - Last In First Out) 마지막에 삽입한 자료를 가장 먼저 꺼낸다. 주요 연산 top : 저장된 원소 중 마지막 원소 push : 저장소에 자료를 저장한다.(삽입) pop : 저장소에서 자료를 꺼낸다.(삭제) peek : 스탯의 top에 있는 item(원소)를 반환한다. 삭제가 일어나지 않는다. java.util.Stack push() pop() isEmpty() size() Func..

힙(heap)

힙(heap) 완전 이진 트리 에 있는 노드 중에서 키 값(data)이 가장 큰 노드나 키 값이 가장 작은 노드를 찾기 위해서 만든 자료구조 최대 힙(max heap) 키 값이 가장 큰 노드를 찾기위한 완전 이진 트리 부모 노드의 키 값 >= 자식 노드의 키 값 - 트리의 모든 노드에 성질 적용 루트 노드 : 키 값이 가장 큰 노드 최소 힙(min heap) 키 값이 가장 작은 노드를 찾기 위한 완전 이진 트리 부모 노드의 키값

너비 우선 탐색(BFS) / 깊이 우선 탐색(BFS)

너비 우선 탐색(Breadth First Search, BFS) 비선형 자료구조를 완전탐색 너비 - 루트에서 자신까지 오는 간선 수 (각 노드에서의 높이), 높이가 낮은 순서에서 높은 순서로 너비 우선 탐색은 루트 노드의 자식도드를 먼저 모두 차례로 방문한 후, 방문했던 자식 노드들을 기준으로 하여 다시 해당 노드의 자식 노드들을 차례로 방문하는 방식 인접한 노드들에 대해 탐색 후, 차례로 다시 너비우선탐색을 진행해야 하므로, 선입선출 형태의 자료구조인 큐를 활용 BFS() 큐 생성 루트 v를 큐에 삽입 while(큐가 비어 있지 않은 경우) { t L 현재 노드 T의 오른쪽 서브트리로 이동 -> R preorder_traverse(T) if (T is not null) visit(T) preorder_..

트리(tree)

트리(tree) 비선형 구조 원소들 간에 1:N 관계를 가지는 자료구조 원소들 간에 계층관계를 가지는 계층형 자료구조 상위 원소에서 하위 원소로 내려가면서 확장되는 트리모양의 구조 노드(node) - 트리의 원소 한 개 이상의 노드로 이루어진 유한 집합이며 다음 조건을 만족한다. 노드 중 최상위 노드를 루트(root)라고 한다.(상위 노드가 없는 유일한 노드) 나머지 노드들은 n(>=0)개의 분리 집합 T1, T2, ... ,TN 으로 분리될 수 있다. 단말노드(leaf node) : 더 이상 하위 노드를 가질 수 없는 노드 T1, T2, ... ,TN 이들은 각각의 하나의 트리가 되며(재귀적 정의) 루트의 부 트리(sub tree)라고 한다. 용어 정리 노드(node) - 트리의 원소 간선(edge) ..

순열(permutation) / 조합(combination) / 부분 집합(sub set)

순열(Permutation) 서로 다른 것들 중 몇 개를 뽑아서 한 줄로 나열하는 것 서로 다른 n개중 r개를 선택하는 순열 nPr nPr = n * (n-1) * (n-2) * ... * (n-r+1) nPn = n! = n * (n-1) * (n-2) * ... 2 * 1 다수의 알고리즘 문제들은 순서화된 요소들의 집합에서 최선의 방법을 찾는 것과 관련 있다. N 개의 요소들에 대해서 n!개의 순열이 존재 12! = 479,001,600 n > 12 인 경우, 시간 복잡도 폭발적으로 증가 순열과 조합의 차이 - 순서가 의미가 있는가? 순서가 의미가 있으면 : 순열 순서가 의미가 없으면 : 조합 재귀 호출을 통한 순열 생성 numers[] // 순열 저장 배열 isSelected[] // 인덱스에 해당..