본문 바로가기

CS/Algorithm13

[알고리즘] 합병정렬(Merge Sort) 합병정렬(Merge Sort) - 분할 정복(Divide and Conquer) 알고리즘 - 주어진 배열을 두 개의 배열로 계속 분할한 뒤, 합치면서 정렬 - 합병 과정에서 O(n), 분할 과정에서 O(logn)으로 O(nlogn)의 시간복잡도를 가짐 - 합병을 위한 배열을 추가로 필요로 함 선택정렬(Selection Sort) 과정 1) 분할 n개의 데이터가 주어졌을 때, 더 이상 분할할 수 없도록 배열을 두 개로 분할한다. 2) 합병 분할과정에서 나누어진 배열을 정렬을 유지한 상태로 합쳐나간다. 3) 합병 과정 자세히보기 위의 두 배열을 합치는 과정을 통해 합병 단계를 자세히 살펴보면 두 배열을 합칠 새로운 공간을 하나 만든다. 두 배열을 첫번째 위치를 표시하는 인덱스 i(left), j(mid + .. 2020. 7. 13.
[알고리즘] 버블정렬(Bubble Sort) 버블정렬(Bubble Sort) - 제자리 정렬(In-placed sorting) 알고리즘 - 인접한 두 개의 데이터의 대소값을 비교해 정렬하는 방식 - 1 cycle 이 후, 가장 큰 값이 맨 뒤에 위치 - 구현이 간단 - 시간 복잡도 : O(n^2) 선택정렬(Selection Sort) 과정 n개의 데이터가 주어졌을 때, 첫번째 인덱스부터 시작해 인접한 두 개의 값을 비교해 값을 비교해가며 정렬을 한다. 한 사이클을 다 돌게 되면 가장 큰 값이 맨 뒤에 위치하게 된다. 두번째 사이클도 첫번째 사이클과 마찬가지로 첫번째 인덱스부터 시작해 인접한 두 값을 비교해 정렬을 한다. 단, 맨 뒤의 값은 이전 사이클에서 이미 가장 큰 값이 위치하기 때문에 n - 1 번째 인덱스까지 정렬을 한다. 즉, i번째 사이.. 2020. 7. 13.
[알고리즘] 삽입정렬(Insertion sort) 삽입정렬(Insertion Sort) - 제자리 정렬(In-placed sorting) 알고리즘 - 카드를 정렬하는 방법과 유사 - 주어진 데이터에서 첫 번째 인덱스부터 시작해 이미 정렬된 부분에서 가장 적절한 위치를 찾아 삽입하는 방식 - 주어진 데이터의 정렬 상태에 따라 O(n)에서 O(n^2)의 시간 복잡도를 가짐 선택정렬(Selection Sort) 과정 n개의 데이터가 주어졌을 때, 첫번째 인덱스부터 가장 적절한 위치를 찾는다. 그림에서 체크 표시가 이미 정렬된 상태의 데이터 중 삽입이 가능한 위치가 된다 첫번째 인덱스에서는 정렬된 상태의 데이터가 없기 때문에 가능한 위치는 맨앞이 된다 두번째 인덱스를 정렬할 때, 이미 첫번째 사이클에서 정렬된 7의 앞과 뒤, 두 곳에 위치할 수 있다. 8은 7.. 2020. 7. 13.
[알고리즘] 선택정렬(Selection sort) 선택정렬(Selection Sort) - 제자리 정렬(In-placed sorting) 알고리즘 - 주어진 배열 중 최소 값을 찾아 맨 앞의 값과 위치를 바꿔가며 정렬 - 1 Cycle을 수행하고 나면 가장 작은 값의 데이터가 맨 앞에 오게 됨 - 구현이 간단 - 시간 복잡도 : O(n^2) 선택정렬(Selection Sort) 과정 정렬해야할 n개의 데이터가 주어졌을 때 최초 모든 데이터에 대해 최소값을 찾아 맨 앞의 인덱스에 위치 시킨다. 한 사이클이 돌아갔을 때, 가장 작은 값이 맨 앞의 인덱스에 위치된 것을 알 수 있다. 다시 두번째 인덱스부터 시작해 가장 작은 값을 찾아 두번째 인덱스에 위치시킨다. 이러한 과정을 n번째 인덱스까지 반복하면 정렬할 수 있다. 소스코드 package algorith.. 2020. 7. 13.
[알고리즘] 유니온파인드(Union-Find) 알고리즘 알고리즘에 대한 구현 방법 뿐만 아니라 시간복잡도까지 알 수 있도록 공부하자! Union-Find 알고리즘이란? Union-Find 알고리즘은 그래프 알고리즘 중 하나로 서로소 집합, 상호배타적 집합(Disjoint-Set)알고리즘이라고도 불린다. 여러 노드가 존재할 때, 선택한 두 노드가 서로 같은 그래프에 속하는지 판별하는 알고리즘이다. Union-Find 과정 1) Init for(int i = 0; i < parent.length; i++) parent[i] = i; 초기화. 최초 노드는 자기자신을 루트노드로 가진다. 1) Find(x) // x가 속한 그래프의 루트 노드를 반환 static int find(int x) { // x의 루트노드가 x일 경우. 즉, x와 연결된 노드가 없을 경우. i.. 2020. 6. 14.
[알고리즘] 크루스칼(Kruskal) 알고리즘 크루스칼 알고리즘이란? 크루스칼 알고리즘은 그리디 알고리즘을 적용해 그래프의 모든 노드를 최소 비용으로 연결해 최소 비용 신장 트리(MST, Minimum Spanning Tree)를 구하는 알고리즘이다. 그리디 알고리즘 https://dheldh77.tistory.com/52 [알고리즘] Greedy Algorithm(탐욕 알고리즘) Greedy Algorithm[탐욕 알고리즘]이란? 각 단계에서 가장 최선의 선택지(가장 큰, 가장 작은 등)를 고르는 것. Greedy 알고리즘은 구현이 쉽다는 장점이 있지만, 항상 최선의 답을 구하는 것은 아니다. Greedy Alg.. dheldh77.tistory.com 신장 트리(Spanning Tree) 그래프 내의 모든 정점을 포함하는 트리로 모든 정점들을 연.. 2020. 4. 5.
[알고리즘] 배낭 문제(Knapsack Problem) 배낭 문제(Knapsack Problem) 배낭 문제란 배낭에 담을 수 있는 무게의 최대값이 정해져 있고, 일정한 가치와 무게가 정해져있는 짐들을 배낭에 닮을 때, 가치의 합이 최대가 되도록 짐을 고르는 방법을 찾는 문제이다. 배낭 문제는 크게 1) 물건을 쪼갤 수 있는 배낭문제(Fraction Knapsack Problem)와 2) 물건을 쪼갤 수 없는 배낭문제(0/1 Knapsack Problem)으로 나뉜다. 1) 물건을 쪼갤 수 있는 배낭문제의 경우는 가치가 큰 물건부터 담고, 남은 무게 만큼 물건을 쪼개는 방식으로 그리디 알고리즘으로 해결할 수 있다. 2) 물건을 쪼갤 수 없는 배낭문제의 경우는 동적계획법(DP, Dynamic Programming)을 활용해 해결할 수 있다. 0/1 Kanpsa.. 2020. 3. 2.
[알고리즘] 최장 공통 부분수열(LCS, Longest Common Subsequence) 최장 공통 부분수열(LCS, Longest Common Subsequence) 최장 공통 부분 수열은 두 개의 문자열이 주어졌을 때, 문자로 이루어진 부분 수열 중에서 가장 긴 문자열이 일치하는 수열을 말한다. 예를 들어 cdabe와 cdegt가 주어졌다면 이 두 문자열의 최장 공통 부분수열은 cdabe, cdegt 즉, 길이가 3인 부분수열 {c, d, e} 된다. 최장 공통 부분수열 과정 최장 증가 수열은 동적 계획법(DP, Dynamic Programming)을 이용해 풀 수 있다. 각각 n, m길이의 두 문자열 str1, str2가 주어졌을 때, n X m 크기의 2차원 배열을 만든다. 이 2차원 배열은 각 문자열, i번째, j번째 원소까지의 최장 공통 부분을 저장할 배열이다. 각 문자열의 부분문.. 2020. 3. 2.
[알고리즘] 최장 증가 수열(LIS, Longest Increasing Subsequence) 최장 증가 수열(LIS, Longest Increasing Subsequence) 최장 증가 수열이란 어떤 수열이 주어졌을 때, 최장으로 증가하는 부분 수열을 말한다. 즉, 1, 2, 3, ..., i, i+1, i+2, ..., n까지의 수열 a[n]이 주어졌을 때, a[i] 2020. 3. 2.
[알고리즘] 에라토스테네스의 체 에라토스테네스의 체 에라토스테네스의 체는 고대 그리스의 수학자 에라토스테네스가 소수를 찾기위해 만들어낸 방법으로, 마치 체를 치듯이 수를 걸러내기 때문에 에라토스테네스의 체라고 부른다. '에라토스테네스의 체'로 소수를 구하는 방법은 2부터 시작해 하나의 수를 뽑고, 뽑은 수의 배수를 소수의 후보에서 제외시킨다. 에라토스테네스의 체 과정 만약, 1부터 10까지의 수 중 소수를 찾는다면 2부터 시작해서 2의 배수를 소수의 후보에서 제외시킨다. 2, 3, 4, 5, 6, 7, 8, 9, 10 (1은 소수가 아니므로 후보에서 제외)에서 2의 배수를 제거하면 2, 3, 5, 7, 9가 남는다. 2, 3, 5, 7, 9 에서 3의 배수를 제거하면 2, 3, 5, 7이 남는다. 이러한 방식으로 소수의 후보를 계속해서.. 2020. 2. 27.
[알고리즘] 되추적(Backtracking) 알고리즘 되추적(Backtracking) 알고리즘 되추적 알고리즘은 핵심은 '배제'와 '풀이 시간 단축'이다. 조건을 만족하는 모든 경우의 한에서 모든 조합을 탐색한다. 되추적 알고리즘은 적용할 수 있는 대표적인 완전 탐색 알고리즘은 깊이우선탐색(DFS)이다. 깊이 우선 탐색(DFS)는 현재 노드에서 방문해야하는 곳까지 재귀나 스택을 이용해 단말 노드에 도착할 때 까지 깊이 곳을 탐색하는 방법이다. 하지만 DFS의 경우 모든 노드를 방문하기 때문에 굳이 방문해도 되지 않을 노드까지 방문하게되고 이로인해 비효율을 초래한다. 되추적 알고리즘은 이러한 비효율을 해결한다. 노드를 방문함에서 있어서 문제 해결에 가능성이 있지 않은 노드는 배제하므로써 비효율을 해결한다. 즉, 되추적 알고리즘은 DFS에 Pruning을 통해.. 2020. 2. 16.
[알고리즘] 너비 우선 탐색(BFS : Breadth First Search) 알고리즘 너비 우선 탐색 알고리즘이란? 한 노드에서 인접한 노드을 우선으로 탐색하는 방법으로 그림과 같은 그래프가 주어졌을 때, 넓게 탐색한다. BFS는 큐로 구현할 수 있고 주로 두 노드 간의 최단 경로를 찾을 때 사용할 수 있다. 너비 우선 탐색 과정 1) 시작 노드를 큐에 넣는다. 2) 큐에서 노드 하나를 꺼내고 꺼낸 노드와 인접한 노드를 모두 큐에 넣는다 3) 다시 큐에서 노드 하나를 꺼내 인접한 노드를 큐에 모두 넣는다. 4) 큐에 더 이상 노드가 없을 때까지, 즉, 인접한 노드가 존재하지 않을 때까지 반복한다. 너비 우선 탐색 구현 너비 우선 탐색을 소스코드로 구현하기 위해서는 먼저 그래프를 인접행렬로 만들어주어야한다. 인접행렬? 인접행렬이란 그래프가 주어졌을 때, 각 노드와의 연결관계를 이차원 행렬로.. 2020. 1. 14.