본문 바로가기

[알고리즘] 문제 풀이/자료구조 | 알고리즘13

[알고리즘] HashMap, TreeMap, HashSet, TreeSet 1. HashMap 해시 함수란, 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 해시 함수에 의해 얻어지는 값을 해시 값, 해시 코드, 해시 체크섬 혹은 해시라고 부른다. 보통 해시함수는 해시값이 다르다면 서로 다른 데이터를 가지고 있어야 하지만, 해시 값을 결정하는 함수에 따라서 서로 다른 데이터가 하나의 해시값에 저장이 되는 경우도 있다. 이런 경우를 해시 충돌이라고 한다. 해시 충돌이 빈번하게 발생하면 효율성을 떨어뜨리기 때문에 해시 충돌을 최소화하는 것이 좋다. 파이썬에서는 이러한 hashmap을 간단하게 dictionary의 형태로 나타낼 수가 있다. hashmap은 (key, value)의 쌍으로 이루어져 있기 때문에 삽입, 삭제, 탐색 등 모든 함수의 시간복잡도가 전부 O.. 2022. 2. 12.
2021.6.14 TIL: [알고리즘] NP-완전 (NP-Completeness) 여러 문제들을 분류해 보면 주어진 문제의 해를 구하는 알고리즘이 전혀 존재하지 않는 풀 수 없는 문제들이 존재한다. 그리고 풀 수 있는 문제들이 존재한다. 풀 수 있는 존재들을 분류 하면 현실적인 시간 내에 풀 수 없는 문제들과 현실적인 시간 내에, 즉 합리적인 시간 내에 풀 수 있는 문제들이 있다. 오늘 배운 NP-완전 문제들은 현실적인 시간 내에 풀 수 없는 문제들에 속할 것이라고 추정되는 문제들이다. 현실적인 시간은 다항식 시간(polynomial time)을 의미한다. 입력의 크기를 n이라고 할 때 n의 다항식으로 표시되는 시간을 말한다. 즉, O(n^k) 나 O(3nk + 5nk -1), O(n log n) 등이다. 비다항식 시간의 예로는 O(2^n) 혹은 O(n!) 등이 존재한다. 문제에서 요.. 2021. 6. 14.
2021.6.13 TIL : [알고리즘] 백트래킹 (BackTracking) 마지막 알고리즘 수업에서는 백트래킹과 NP-완전을 배웠다. 둘 다 조금은 이해하기 어렵다고 느껴져서 오늘은 이 내용을 정리해보고자 한다. 문제에서 어떤 해를 구할 때, 해의 형태가 n개의 원소로 이루어진 튜플인 경우가 있다. (이 때, 이 튜플 내의 각 원소를 x1, x2, x3, ... xn이라고 한다.) 해의 원소들(xi)은 유한 집합(Si)에서 선택된다. 백트래킹은 기준함수인 P를 최대화/최소화/만족하는 해를 구하는 문제를 해결하는데 적용하는 방법으로 효율적인 알고리즘이 존재하지 않을 경우에 사용한다. 모든 문제의 사례에 대해서 효율적이진 않지만 많은 문제 사례에서 효율적이다. mi를 Si의 크기, 즉 원소의 개수라고 하면, xi가 선택할 수 있는 해는 각각 m1, m2, m3, ..., mi, ... 2021. 6. 13.
2021.3.7 TIL : [알고리즘] 깊이 우선 탐색(Depth First Search) 깊이 우선 탐색은 탐색을 함에 있어서 보다 깊은 것을 우선적으로 하여 탐색하는 알고리즘이다. 깊이 우선 탐색은 기본적으로 전체 노드를 맹목적으로 탐색하고자 할 때 사용한다. 깊이 우선 탐색 알고리즘은 스택(stack) 자료 구조에 기초한다. 빠르게 모든 경우의 수를 탐색하고자 할 때 쉽게 사용할 수 있다. dfs의 순서 : 1. 탐색 시작 노드를 스택에 삽입하고 방문처리를 한다. 2. 스택의 최상단 노드에게 방문하지 않은 인접노드가 하나라도 있으면 그 노드를 스택에 넣고 방문 처리한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다. 3. 2번 과정을 더 이상 수행할 수 없을 때까지 반복한다. 깊이 우선 탐색 알고리즘은 스택(stack) 자료구조에 기초한다는 점에서 구현이 간단하다. 실.. 2021. 3. 7.
2021.2.27 TIL : [자료구조] 그래프의 개념과 구현 그래프(Graph)란 사물을 정점(Vertex)와 간선(Edge)으로 나타내기 위한 도구이다. 지금까지 배운 자료 구조 중에 가장 복잡하면서도 일반적이라고 할 수 있다. 우리가 흔히 보는 지하철 노선도가 그래프랑 비슷하게 생겼다고 볼 수 있다. 각각의 역은 노드, 그리고 역과 역 사이에 이어진 노선은 에지로 생각하면 된다. 경로(Path)는 어떤 노드에서 다른 노드로 가는 길이라고 볼 수 있다. 같은 인덱스를 두 번 이상 거치게 되면 경로라고 부르지 않는다. 사이클(Cycle)은 어떤 노드에서 출발해서 제자리로 돌아오는 닫힌 경로를 말한다. 사이클은 그래프에 존재하지 않을 수도 있고, 2개 이상 있을 수도 있다. 사이클이 존재하지 않는 그래프의 경우, 두 노드를 연결하는 경로가 최대 1개씩 밖에 없다. .. 2021. 2. 27.
2021.2.25 TIL : [자료구조] 순차 탐색과 이진 탐색(Sequential Search and Binary Search) 순차 탐색(Sequential Search)이란 특정한 원소를 찾기 위해 원소를 순차적으로 하나씩 탐색하는 방법이다. 데이터 정렬 유무에 상관 없이 가장 앞에 있는 원소부터 하나씩 확인해야 한다는 점에서 O(N)의 시간 복잡도를 가진다. 순차 탐색 코드는 여기에서 확인할 수 있다. 이진탐색(Binary Search)은 배열 내부 데이터가 이미 정렬 되어 있는 상황에서만 사용 가능한 알고리즘이다. 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 특징이 있다. 이진 탐색은 한 번 확인할 때마다 보아야 하는 원소의 개수가 절반씩 줄어든다는 점에서 탐색 시간에서 O(log N)의 시간 복잡도를 가진다. 여기에서 이진 탐색 코드를 확인할 수 있다. 2021. 2. 26.