본문 바로가기

Coding/알고리즘

(5)
Kruskal, Prim 알고리즘 Kruskal 알고리즘이란 - greedy method를 이용하여 네트워크(가중치를 간선에 할당한 그래프)의 모든 정점을 최소 비용으로 연결하는 최족 해답을 구하는 것 - greedy method 결정을 해야 할 때마다 그 순간에 가장 좋다 생각되는 것을 선택함으로써, 최종적인 해답에 도달 그 순간에는 최적이지만, 전체적인 관점에서 최적이라는 보장이 없기 때문에 반드시 검증해야 한다 Kruskal 알고리즘은 최적의 해답을 주는 것으로 증명되어 있다 - MST(Minimum Spanning Tree, 최소 비용 신장 트리)가 1)최소 비용의 간선으로 구성됨 2) 사이클을 포함하지 않음 의 조건에 근거하여 각 단계에서 사이클을 이루지 않는 최소 비용 간선을 선택한다 - spanning tree는 모든 간선을..
Greedy 알고리즘이란 Greedy(탐욕, 탐욕법) 알고리즘 - 문제를 해결하는 과정에서 그 순간순간마다 최적이라고 생각되는 결정을 하는 방식으로 진행하여, 최종 해답에 도달하는 문제 해결 방식이다 - 미래를 생각하지 않고 각 단계에서 가장 최선의 선택을 하는 기법으로, 각 단계에서의 최선의 선택이 전체적으로도 최선이길 바라는 알고리즘이다 - 따라서 모든 경우에서 통하지 않는다 - 이러한 단점을 극복하는 greedy의 가장 큰 장점은 계산 속도에 있다 - greedy 방법이 통하는 몇몇 문제에서는 최적해를 빠르게 산출해낼 수 있다 예시 활동 선택 문제 한 강의실에서 여러 개의 수업을 하려고 할 때, 한 번에 가장 많은 수업을 할 수 있는 경우를 고르는 것 - [A1, A3, A6, A8]이나 [A1, A3, A7, A9]를 고..
Binary Search란 Binary Search(이분 탐색, 이진 탐색)이란 - 데이터가 정렬되어 있는(binary search의 주요 조건) 배열에서 특정 값을 찾아내는 알고리즘 - 배열의 중간에 있는 임의의 값을 선택해서, 찾고자 하는 값 X와 비교한다 - X가 중간값보다 작으면 중간값을 기준으로 왼쪽의 데이터를 대상으로, - X가 중간값보다 크면 배열의 우측을 대상으로 다시 탐색한다 - 동일한 과정을 해당 값을 찾을 때까지 반복한다 예시 array =[1, 2, 3, 4, 5, 6] 에서 6을 찾자 step 1 중간값 middle = 3 3과 6을 비교한다 -> 3 5 < 6 step 3 5의 ..
Dynamic Programming이란 Dynamic Programming(동적계획법)이란? 큰 문제를 작은 문제로 나누어 푸는 문제를 말한다. 동적 계획법이라는 말 때문에, 어떤 부분에서 동적으로 프로그래밍이 이루어진다고 생각할 수 있지만, 단지 동적 계획법이라는 말이 멋있어서 붙인 이름으로 dynamic이라는 말과 연관이 거의 없다. divide and conquer과 비슷하다고 생각할 수 있지만, 차이점은 작은 문제가 중복이 일어나는지 안 일어나는지이다. divide and conquer는 큰 문제를 해결하기 어려워 작은 문제로 나누어 푸는 방법이다. 특징은, 작은 문제에서 반복이 이렁나지 않는다는 것이다. dynamic programming은 작은 (답이 바뀌지 않는) 부분문제들이 반복되는 것이다. Dynamic Programming ..
그래프 - 인접 행렬과 인접 리스트 인접 행렬 정의 인접 행렬은 그래프의 연결 관계를 이차원 배열로 나타내는 방식. adj[i][j]: 노드 i에서 노드 j로 가는 간선이 있으면 1, 아니면 0 간선에 방향이 있는 유향 그래프가 아닌, 간선에 방향이 없는 무향 그래프의 경우에는, 노드 i -> 노드 j가 존재하면 노드 j -> 노드 i도 존재하는 것이다. 따라서 대각 성분(adj[i][j]에서 i == j)을 기준으로 대칭인 성질을 가지게 된다. 장점 - 구현이 쉽다 - 노드 i와 노드 j가 연결되어 있는지 확인하고 싶을 때, indexing으로 접근하기 때문에 O(1)의 시간 복잡도를 가진다 단점 - 전체 노드의 개수를 V개, 간선의 개수를 E개라고 하면, 노드 i에 연결된 모든 노드들에 방문하고 싶은 경우 adj[i][1]부터 adj[..