강의자료/알고리즘 33

[알고리즘]다익스트라(Dijkstra) 알고리즘

다익스트라(Dijkstra) 알고리즘 다익스트라(Dijkstra) 알고리즘은 출발점이 있는 곳에서 모든 정점까지의 최단거리를 찾는 알고리즘이다. 경로에 음수가 포함되면 경로를 찾을 수 없다. 알고리즘 모든 정점의 최단거리를 구할 배열 d[]를 만들고 배열에 INF 값을 채워 넣는다.(INF 는 경로의 계산에서 나올 수 없는 매우 큰 값을 의미한다.) 출발하는 정점의 위치에 0을 채워 넣는다. 방문하지 않은 경로 중 현재까지의 값중에서 가장 짧은 거리의 정점을 선택한다.(만약 이 값이 INF 라면 갈 곳이 없다는 것이므로 더이상 진행하지 않아도 된다.) 선택된 정점은 방문한 정점으로 마킹을 한다. 선택된 정점에서 갈 수 있는 모든 경로를 가 보면서 자신까지 온 거리와 다음 정점까지 갈 수 있는 거리의 합이..

강의자료/알고리즘 2023.03.16 (9)

[알고리즘] Floyd-Warshall(플로이드워셜) 알고리즘

1. 플로이드 워셜(Floyd-Warshall) 알고리즘 플로이드 워셜 알고리즘이란 모든 정점들간의 상호 최단거리를 구하기 위한 알고리즘이다. 시간복잡도는 O(N^3) 으로 i에서 j를 갈때 i->k->j 와 같이 모든 정점(k)를 거쳐서 i 에서 j를 가면서 가장 가까운 거리를 찾는 알고리즘이다. 기본적인 알고리즘 의사코드는 다음과 같다. 1 let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity) 2 for each edge (u,v) 3 dist[u][v] ← w(u,v) // 변 (u,v)의 가중치 4 for each vertex v 5 dist[v][v] ← 0 6 for k from 1 to |V| 7 for ..

강의자료/알고리즘 2023.03.09 (14)

[알고리즘] 크루스칼알고리즘

크루스칼 알고리즘이란? 그래프 내의 모든 정점들을 가장 적은 비용으로 연결 하기 위해 경로를 찾을 때 사용되는 알고리즘입니다. 즉 그래프에는 노드(node)와 엣지(edge)가 있으며 엣지에는 가중치가 포함되어 있습니다. 이러한 그래프에서 모든 정점을 포함하고 사이클(Cycle)이 없는 연결선을 그렸을 때 가중치의 합이 최소가 되는 값을 구할 때 사용합니다. 크루스칼 알고리즘은 다음과 같은 단계로 구합니다. 1단계 : 각 정점 하나만을 포함하는 n개의 집합을 만듭니다. 2단계 : 모든 간선을 가중치 값을 기준으로 오름차순으로 정렬합니다. 3단계 : 가중치가 가장 작은 것 부터 검사하여 간선이 서로소(disjoint)인 두 집합을 연결하면 그 간선을 추가하고 연결된 두 집합을 하나의 집합으로 연결 합니다...

강의자료/알고리즘 2023.02.23 (12)

[알고리즘] 부분합

부분합 알고리즘이란? N명의 시험 성적을 내림차순으로 정렬해 둔 score[] 가 있다고 하면 여기서 우리는 a등에서 b등까지의 평균을 구하려고 한다. 가장 간단한 알고리즘으로는 a등부터 b등까지의 합을 구한 다음 b - a + 1 로 나누는 것이다. 하지만 이렇게 구하는 횟수가 빈번해진다고 하면 1회를 구할 때마다 최대 N번씩 반복하게 된다. 이럴 때 유용하게 사용하는 것이 부분합(Partial sum)이다. 위와 같이 psum 테이블을 미리 구해 놓는다고 하면 2번지 부터 4번지까지의 부분합을 구하려고 하면 psum[4] 는 0,1,2,3,4 의 모든 합이기 때문에 여기서 0,1 의 값을 빼면 2번지부터 4번지 까지의 부분합이 된다. 따라서 psum[4] - psum[1] 의 값이 2번지 부터 4번지..

강의자료/알고리즘 2023.02.08 (8)

[알고리즘] 조합탐색

조합탐색이란? - 완전 탐색 알고리즘은 대개 답을 만드는 과정을 여러개의 선택으로 나눈 뒤 재귀 호출을 이용해 각각의 선택지를 채워가는 형태로 구현됨 - 기존 완전 탐색은 모든 답을 다 만들어 보면서 문제를 해결하므로 완전 탐색의 수행시간은 탐색 공간의 크기에 직접적으로 비례 - 이는 문제의 규모에 따라 기하급수적으로 크기가 증가. - 조합탐색이란 완전 탐색을 포함해 유한한 크기의 탐색 공간을 뒤지면서 답을 찾아 내는 알고리즘 목표 - 기본적으로 모두 최적해가 될 가능성이 없는 답들을 탐색하는 것을 방지하여 만들어 봐야 하는 답의 수를 줄이는 것을 목표로 함 조합탐색 최적화 기법 - 가지치기 : 탐색 과정에서 최적해로 연결될 가능성이 없는 부분을 잘라낸다. 예) 외판원 문제에서 길이가 10인 경로를 이미..

강의자료/알고리즘 2023.02.01 (12)

[알고리즘] 동적계획법(Dynamic)

동적계획법 알고리즘이란 동적계획법은 문제의 최적해를 구하거나 답의 개수를 세는 과정에 사용하는 알고리즘 설계기법 - 전체 문제를 작은 문제로 단순화 한 다음 점화식으로 만들어 재귀적인 구조를 활용해서 전체 문제를 해결하는 방식 동적계획법 알고리즘 설계 방법 1. 전체 문제를 작은 문제로 단순화한다. -> 부분문제를 정의 2. 재귀적인 구조를 활용할 수 있는 점화식을 만든다. 3. 작은 문제를 해결한 방법으로 전체 문제를 해결한다. 메모이제이션 기법 메모이제이션(Memoization)은 동적계획법에서 아주 중요한 개념이다. 함수의 값을 계산한 뒤 계산된 값을 배열에 저장하는 방식이다. 이러한 메모이제이션은 필요한 때마다 함수를 다시 호출하지 않고 값을 빠르게 가져 올 수 있다. 동적알고리즘 예시문제 www..

강의자료/알고리즘 2023.01.18 (12)

[알고리즘] 분할정복

분할정복 알고리즘이란? 분할정복(Divide and conquer algorithm)은 그대로 해결 할 수 없는 문제를 작은 문제로 분할하여 문제를 해결하는 방법이다. 대표적인 예로 퀵정렬 또는 합병정렬과 같은 알고리즘이 있다. 알고리즘을 설계하는 요령 - Divide : 문제가 분할이 가능한 경우, 2개 이상의 문제로 나눈다. - Conquer : 나누어진 문제가 여전히 분할이 가능하면 또 다시 Divide를 수행한다. 그렇지 않으면 문제를 정복한다. - Combine : : Conquer한 문제들을 통합하여 원래 문제의 답을 얻는다. ※ 문제를 제대로 나누면 conquer 하는 것이 쉽기 때문에 Divide 를 제대로 하는것이 가장 중요하다. 분할정복 알고리즘 예 function F(x): if F(..

강의자료/알고리즘 2023.01.11 (12)

[자료구조] Suffix Array(접미사 배열)

컴퓨터 과학에서 접미사 배열(Suffix Array)란 어떤 문자열의 접미사를 사전식 순서대로 나열한 배열을 말한다. S = S[0]S[1]...S[n-1] 이라는 문자열이 있다고 하자. 이때 S[i,j] 는 i번째 문자부터 j번째 문자 까지 S의 부분 문자열이라고 하자. 문자열 S에 대한 접미사 배열 A는 S의 접미사들을 사전식 순서로 정렬 했을 때 접미사의 시작 위치를 저장한 정수 배열이다. 즉 A[i] 에 저장 된 내용은 사전순으로 i 번째인 S의 접미사의 시작 위치이다. 다시 말하면 문자열 S의 길이를 n이라고 할 때 , 0

강의자료/알고리즘 2023.01.04 (11)

[자료구조] Persistent Segment Tree (PST)

Persistent 의 의미는 보존 된다는 의미인데 이 알고리즘의 핵심은 서로 다른 세그먼트 끼리 값을 보존 하며 공유하는 것이 핵심입니다. 예제 문제로 다음의 문제를 예로 들어 봅시다. https://www.acmicpc.net/problem/11012 11012번: Egg You are a president deeply loved by many folks in your country. Every time you go on a parade (which is your main job, what else should a president do), the folks would throw eggs at you — because you love eggs! The folks passionately send the..

강의자료/알고리즘 2022.12.27 (12)

[자료구조]Dynamic Segment Tree

Dynamic Segment Tree 는 다음과 같은 경우에 사용됩니다. 0으로 초기화 된 10억개의 수열이 있을 때 Q(10만)개의 질의에 대해 실시간으로 업데이트와 그에 대한 답을 구하는 경우 일반적인 세그먼트 트리로는 10억개의 공간을 모두 할당 할 수 없기 때문에 불가능 합니다. 하지만 이때 잘 생각해 보면 1번의 쿼리에 변경되는 노드의 갯수는 log2(10억) =(약)21의 갯수만 변경 되는 것을 알 수 있습니다. 따라서 최대 21 * Q(10만) 개의 공간만 있으면 가능하겠다는 아이디어에서 Dynamic Segment Tree 는 출발 합니다. 즉 다음과 같은 트리에서 2번 위치의 값이 변경이 된다면 노드의 갯수를 회색으로 색칠 된 3개만 만들어 놓겠다는 것이 Dynamic Segment Tr..

강의자료/알고리즘 2022.10.04 (6)