반응형
힙(Heap)이란 ? 완전 이진 트리의 일종으로, 데이터에서 최댓값과 최솟값을 빠르게 찾기 위해 만들어진 자료구조입니다. 힙을 사용하는 이유는 최댓값과 최솟값을 찾기 위해 배열을 사용하는 경우 O(n)의 시간복잡도가 걸리는 반면, 힙을 사용하면 O(logn)의 시간복잡도가 소요되므로 시간적으로 효율적이기 때문입니다. 완전 이진 트리 (Complete Binary Tree)란 ? 이진 트리에 노드를 삽입할 때 왼쪽부터 차례대로 삽입하는 트리로 아래 그림과 같습니다. 만약, 왼쪽이 비어 있고 오른쪽이 채워져있다면 완전 이진 트리라고 할 수 없습니다. 힙의 특징 힙은 최대 힙과 최소 힙으로 나눠집니다. 최대 힙(max heap) : 부모 노드의 값이 자식 노드이 값보다 크거나 같은 완전 이진 트리. ( 부모 ..
Binary Search(이진 탐색/이분 탐색) 이진 탐색 알고리즘은 정렬되어 있는 배열에서 찾고자 하는 특정한 값을 찾아내는 알고리즘입니다. 이진 탐색 알고리즘이 탐색하는 방식은 배열의 중간에 있는 값(mid)을 선택하여 찾고자하는 값(x)과 비교합니다. 찾고자하는 값(x)가 중간 값(mid)보다 작으면 중간 값을 기준으로 왼쪽으로 다시 탐색, 크다면 오른쪽으로 다시 탐색합니다. 다시 탐색을 시작할 때 찾고자하는 값(x)가 중간 값(mid)보다 작으면 해당 중간 값부터 우측 끝값을 제거하고 다시 중간 값을 선택하고 찾고자하는 값(x)을 찾습니다. 반대로 찾고자하는 값(x)가 중간 값(mid)보다 크면 해당 중간 값부터 좌측 끝값을 제거 하고 다시 중간 값을 선택하고 찾고자하는 값(x)를 찾습니다. 찾고..
완전탐색 완전탐색이란 이름 그대로 모든 것을 탐색 즉, "모든 경우의 수를 다 만들어 보는 방법"입니다. 만약 휴대폰 비밀번호 4자리의 핀 번호를 까먹어서 0000 ~ 9999 까지 모든 수를 도전 해본다면, 최대 10000번의 도전이 있을 것입니다. 이 처럼 완전 탐색은 무식하게 모든 경우의 수를 전부 탐색하기 때문에 시간 복잡도가 매우 커서 입력값의 크기가 작을 때 사용하기 좋습니다. 완전탐색 알고리즘 1. Brute Force 단순한 반복문(for)과 조건문(if)으로 모든 경우의 수를 만들어 답을 구하는 방법입니다. 아주 기초적인 문제에 주로 나옵니다. 2. Bitmask (비트마스크) 2진수를 이용하는 컴퓨터의 연산을 이용하는 방식 나올 수 있는 모든 경우의 수가 "각각의 원소가 포함되거나, 포..
Greedy(탐욕) 알고리즘이란 ? Greedy를 번역하면 "탐욕스러운"이라는 뜻을 가집니다. 그리디 알고리즘은 탐욕이란 뜻처럼 현재 상황에서 최적의 해만을 선택합니다. 그리디는 현재 상황의 최적의 해를 구하는다는 것에 중점을 두어야하는데, 그 이유는 다음 그림을 봅시다. 가장 큰수를 찾기 위해 앞으로 간다면 제일 큰 수가 있는 "1000"과 연결되어 있는 100 -> 1000 을 생각할 것입니다. 하지만 Greedy 알고리즘은 시작부터 두 수중 가장 큰 수인 "500"을 탐색하고 그 다음 큰 수인 "200"을 탐색합니다. 이 처럼 그리드는 최종결과에서의 최적의 해가 아닌 "현재상황에서 최적의 해"를 구합니다. 그리디 알고리즘 적용 조건 1. 탐욕스러운 선택 조건 앞의 선택이 이후의 선택에 영향을 주지 ..
백트래킹(Back Tracking) 백트래킹은 깊이 우선 탐색(DFS)를 진행하며 탐색 중인 경로에 답이 없다고 판단되면 해당 노드를 제거하고, 탐색을 시작했던 부모 노드에서 바른 방향으로 다시 탐색합니다. 여기서 더 이상 탐색할 필요가 없는 노드를 제외하는 것을 가지치기(Pruning)이라 하고 해당 경로에 답이 있다고 판단되는 경우에는 유망하다(Promising)이라고 합니다. 즉, 백트래킹은 DFS탐색을 진행하며 유망한 조건을 만족하는 방향으로만 탐색하는 알고리즘입니다. 백트래킹 탐색 과정 ACG라는 단어를 찾는다고 가정했을 시 다음과 같은 순서로 탐색을 진행합니다. DFS탐색을 진행하여 "A"노드에서 "B"노드를 방문합니다. A다음 찾는 단어는 C로 "B"노드가 아니기 때문에 가지치기를 하고 부모..
DFS (깊이 우선 탐색, Depth First Search) DFS는 그래프에서 깊은 부분을 우선적으로 탐색합니다. 한 정점에서 시작해 다음 경로로 넘어가기 전에 해당 경로를 완벽하게 탐색할 때 사용합니다. 특징 스택 자료 구조에 기초하며, 구현할 때 재귀 함수로 구현하는 것이 좀더 간편합니다. DFS를 구현할 때, 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 검사하지 않을 시 무한 루프에 빠질 위험이 있으므로 반드시 검사해야합니다. ( visited[index] = true; ) 미로를 탐색할 때, 해당 분기에서 갈 수 있을 때까지 계속 가다가 더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로(새로운 분기)로 돌아와서 다른 방향으로 다시 탐색을 진행하는 방법과 유사합니다. 모든 경우를 하나..