알고리즘/이론 14

이분탐색

탐색 범위를 줄여가며 탐색하는 방법. mid 값을 정해서 범위를 줄여나간다. 숫자 정해두고 맞추는 업다운게임과 비슷한 방법. 시간 복잡도는 연산 한 번으로 범위를 절반으로 줄이기 때문에 Log N 이분탐색 코드는 두 부분으로 나뉜다. 범위를 줄여나가는 부분 -> 이분 탐색 범위를 줄일 기준을 정하는 부분(ask 함수 : T/F 반환) -> 결정 문제 1번 부분에서는 left, right, mid값을 정해서 2번 부분이 리턴하는 값에 따라 left, right의 값을 조절해 범위를 줄여나간다. 예시로 백준의 나무 자르기 문제(https://www.acmicpc.net/problem/2805)를 풀어보면, 1번 부분 코드 (이분 탐색) while (left < right) { mid = (left + rig..

알고리즘/이론 2024.02.10

최단경로 알고리즘

1. 플로이드 워셜 * 이론 모든 지점에서 다른 지점까지의 최단거리를 계산할 때 쓰임. 시작지점을 잡고 목표지점을 잡는다 시작에서 목표로 가는데 이 사이에 어떠한 중간지점을 껴서 가는 게 더 짧다면 이 짧은 거리로 경로를 갱신 이거를 모든 곳에서 함 (모든 시작 모든 목표 모든 중간에서 함) 비어있는 곳은 엄청큰수(inf)로 설정 후 진행 * 구현 for문 세 개 쓰면 됨(중간 - 시작 - 끝 순서로) 만약 그래프의 특정 경로가 중간 지점 거친 경로보다 더한 게 더 크면 갱신 for (int k=0; k 노드 개수 많으면 쓸 수 없음 2. 다익스트라 * 이론 1개의 노드에서 다른 모든 노드로 가는 최단거리 하나의 최단거리를 구할 때 이전까지 구했던 최단 거리 정보를 이용한다. 현재까지 알고 있던 최단 경..

알고리즘/이론 2023.11.27

DFS/BFS

DFS는 스택/재귀로 구현 가능 -> 모든 노드 방문 BFS는 큐로 구현 가능 -> 최단 거리 1. 흐름 1) DFS - 재귀 시작 노드 받아서 방문했다 표시해주고 그래프 사이즈만큼 돌면서 그 그래프에 붙어있는 애들 하나씩 빼서 만약 방문하지 않은애면 다시 dfs 돌기 2) DFS - 스택 시작값 스택에 넣고, 방문했다 표시 스택이 빌때까지 스택의 맨 위에 있는 애한테 붙어있는 애들 하나씩 빼서 만약 방문하지 않았으면 방문했다하고 스택에 추가 더이상 방문하지않거나, 인접한 노드 없으면 스택에서 pop 3) BFS 시작 노드 받아서 큐에 넣고 방문했다 표시 큐가 빌때까지 큐의 앞에서 값 빼내고 아까 빼낸애한테 붙어있는 애들 개수만큼 돌면서 하나씩 빼내서 방문하지 않은애면 큐에 넣고 방문했다 표시 2. 구현..

알고리즘/이론 2023.11.22

DFS / BFS

# DFS (Depth First Search) '깊이 우선 탐색'이라는 이름에서 알 수 있듯이, 최대한 깊숙이 들어가서 확인하고, 돌아가서 또 반복하며 트리나 그래프를 탐색한다. 가장 마지막에 만났던 갈림길의 정점으로 돌아가서 다시 DFS를 진행해야 하므로 후입 선출 구조의 스택을 사용한다. input 사이즈가 너무 크지 않다면 스택뿐만 아니라 재귀 호출로도 구현 가능하다. - 재귀를 이용한 코드 void recur_dfs(int node) { visited[node] = true; for(int next=0; next

알고리즘/이론 2022.07.26

[C++] MST 구현

자세한 이론은 이전 글 참고! https://qqs-diary.tistory.com/106 MST (Minimum Spanning Tree) MST란 그래프의 모든 vertex를 최소 edge의 weight로 연결한 그래프이다. 최소 비용으로 모든 도시의 도로를 연결하거나, 통신망을 연결하는 데 응용할 수 있다. Kruskal's Algorithm MST를 찾아내는 알고리 qqs-diary.tistory.com 이론 정리글에서 사용했던 그래프를 이용해서 코드로 구현해보자. 이 그래프를 MST로 만들면 총 가중치는 1+2+3+3+3+4+5 = 21이 된다. 코드 #include #include #include #define SZ 8 using namespace std; int getparent(int cy..

알고리즘/이론 2022.06.29

MST (Minimum Spanning Tree)

MST란 그래프의 모든 vertex를 최소 edge의 weight로 연결한 그래프이다. 최소 비용으로 모든 도시의 도로를 연결하거나, 통신망을 연결하는 데 응용할 수 있다. Kruskal's Algorithm MST를 찾아내는 알고리즘으로, 가장 작은 weight를 갖는 edge를 추가하면서, 모든 vertex가 연결될 때까지 반복한다. 이때 cycle이 발생하지 않도록 주의한다. 정리하자면, Kruskal algorithm은 1. weight의 오름차순으로 edge를 더해가는데 2. edge의 개수가 vertex-1개가 될 때까지만 반복한다. 3. Cycle이 생기지 않도록 유의하면서 과정을 진행한다. 그렇다면 cycle은 어떻게 찾을까? cycle detection 배열을 이용한다. 연결되었다면 알파..

알고리즘/이론 2022.06.28

[C++] map(STL)

map은 검색, 삽입, 삭제가 O(logn)인 레드블랙트리로 구현되어 있다. key 값과 value 값을 가지며, 중복된 값은 제거되고 오름차순으로 정렬된다. c++에서 사용시, #include 을 해줘야 하며, map 헤더파일을 추가하면 중복이 허용되는 mulitmap도 사용할 수 있다. - 선언 map m; //key 값의 자료형은 string, value 값의 자료형은 int 기본적으로 key 값인 string 데이터가 오름차순으로 정렬되어 값이 들어가지만, 내림차순으로 정렬하고 싶다면 map m; (하지만 greater라고 한다고 해서 key 값이 아닌 value 값으로 정렬할 수는 없다.) - 데이터 삽입 m.insert({"abc",1}); - find map에 특정 값이 존재하는지 확인 후,..

알고리즘/이론 2022.06.22

우선순위 큐

개념 우선순위 큐란 우선순위가 높은 데이터를 먼저 꺼내는 자료구조이다. 우선순위 큐는 보통 힙으로 구현한다. 힙은 Max heap, Min heap이 있는데, Max heap은 부모노드가 자식노드보다 큰 힙이고, Min heap은 부모노드가 자식노드보다 작은 힙이다. 따라서 오름차순으로 정렬할 경우에는 Min heap을, 내림차순으로 정렬할 경우에는 Max heap을 사용한다. c++에서는 헤더파일을 이용하여 우선순위 큐를 간단하게 구현할 수 있다. 구현 (queue 헤더파일 사용 x) - heap에 데이터 추가 void addToHeap(int v, int last) { int cur = last +1; int parent = cur/2; arr[cur] = v; while(1) { if(arr[par..

알고리즘/이론 2022.06.16

[C++] BST 구현

코드 - 노드 생성 typedef struct node { int i; struct node *left; struct node* right; }node; - BST에 삽입 void add(int n) { node* newnode = (node*)malloc(sizeof(node)); //노드 생성 newnode->i=n; newnode->left=newnode->right=0; if(root = 0) //BST가 비어있는 경우 { root= newnode; return; } node*cur = root; while(1) //BST가 비어있지 않은 경우 { if(newnode->ii) //넣으려고 하는 노드가 현재 가리키는 노드의 값보다 작다면 { if(cur->left==0) //왼쪽에 들어가야 하므로 ..

알고리즘/이론 2022.06.15