본문 바로가기
반응형

분류 전체보기313

버블 정렬(Bubble Sort) 이번에 배워볼 정렬 알고리즘은 버블 정렬(Bubble Sort)이다. 버블 정렬은 인접한 2개의 원소를 비교하여 크기가 순서대로 되어 있지 않으면 서로 교환하는 비교-교환 과정을 리스트의 왼쪽 끝에서 시작하여 오른쪽 끝까지 진행하여 정렬하는 알고리즘이다. 선택 정렬과 삽입 정렬은 정렬된 원소들이 좌측에 위치하는 반면, 버블 정렬은 이와 다르게 정렬된 원소들이 우측에 위치하는 차이점이 존재한다. 버블 정렬의 가장 큰 문제점은 순서에 맞지 않은 원소를 인접한 원소와 매번 교환한다는 것이다. 특정 원소가 최종 정렬 위치에 이미 있는 경우라도 교환되는 일이 발생하기 때문에 구현하기가 정말 단순하지만 좋지 못한 성능 때문에 거의 사용되지 않는다. 버블 정렬(Bubble Sort)의 시간 복잡도는 O(N^2)이다... 2021. 7. 1.
삽입 정렬(Insertion Sort) 이번에 배워볼 정렬 알고리즘은 삽입 정렬(Insertion Sort)이다. 삽입 정렬은 손안의 카드를 정렬하는 방법과 유사하다. 새로운 원소를 기존에 정렬된 원소 사이의 올바른 자리를 찾아 삽입함으로써 정렬이 유지되게 한다. 삽입 정렬은 비교적 많은 레코드들의 이동을 포함하기 때문에 레코드 수가 많고 레코드 크기가 클 경우에 적합하지 않음을 알 수 있다. 반면, 안정한 정렬 방법으로서 레코드의 수가 적을 경우 알고리즘 자체가 매우 간단하므로 다른 복잡한 정렬 방법보다 유리할 수 있다. 또한, 삽입 정렬은 대부분의 레코드가 이미 정렬되어 있는 경우에는 매우 효율적일 수 있다. 삽입 정렬(Insertion Sort)의 시간 복잡도는 O(N^2)이다. 다만, 리스트가 이미 정렬되어 있는 상태라면 O(N)의 시.. 2021. 7. 1.
선택 정렬(Selection Sort) 정렬 알고리즘은 알고리즘에서 가장 먼저 배우는 알고리즘이다. 정렬 알고리즘에는 선택 정렬, 삽입 정렬, 버블 정렬, 합병 정렬, 퀵 정렬, 힙 정렬 등 다양한 정렬 알고리즘이 존재한다. 선택, 삽입, 버블 정렬은 구현이 상대적으로 쉽지만 성능이 좋지 않은 반면, 합병, 퀵, 힙 정렬은 구현이 상대적으로 복잡하지만 성능이 훨씬 좋기 때문에 후자의 정렬들을 사용하는 것을 나는 선호하는 편이다. 하지만 성능의 차이를 알기 위해선 모든 정렬 알고리즘의 원리를 알아야한다. 이번에는 선택 정렬(Seletcion Sort)을 다뤄보겠다. 선택 정렬은 주어진 리스트를 돌면서 가장 작은(큰) 원소를 찾아 정렬된 원소를 제외한 제일 앞의 원소와 교환해주면 되기 때문에 가장 이해하기가 쉽고 단순한 정렬 방법이다. 선택 정렬.. 2021. 7. 1.
세그먼트 트리(Segment Tree) 이번에 배워볼 자료구조는 세그먼트 트리(Segement Tree)이다. 최근 코딩 테스트에서 세그먼트 트리를 알고 있다면 조금 더 쉽게 해결할 수 있는 문제들이 나오고 있어서 한번 다뤄보려 한다. 세그먼트 트리는 이해하고 구현하는데 난이도가 상당히 있으며, 아직까지는 굳이 몰라도 된다고 생각하기 때문에 보다가 이해가 안 된다면 과감하게 버리는 것을 추천한다. 세그먼트 트리는 트라이처럼 트리를 활용한 자료구조이다. 세그먼트 트리를 이해하기 위해 사용되는 구간 합 구하기라는 대표적인 문제가 있다. 이 문제를 통해 세그먼트 트리를 이해해 보자. 구간 합 구하기 문제는 N 개의 숫자가 나열돼있을 때 a~b 구간 데이터들의 합을 구하는 문제이다. 구간 합을 구하는 방법은 대표적으로 3가지가 존재한다. 첫 번째는 .. 2021. 6. 30.
트라이(Trie) 이번에 배워볼 자료구조는 트라이(Trie) 자료구조이다. 요즘 코딩 테스트에서 트라이를 이용하여 푸는 문제들이 자주 등장하여 한번 짚고 넘어가려 한다. 트라이를 공부하기 전에 트라이가 왜 필요한지 알아보자. 현재 "abbce", "acd", "bfgaa", abbga", "acde"의 문자열을 포함하는 리스트가 존재한다고 하자. 만약 "bfgaa"라는 문자열이 리스트 내에 존재 유무를 파악하기 위해선 우리는 리스트에 들어있는 문자열들을 비교해봐야 한다. 리스트 내에 찾고자 하는 문자열이 존재하지 않는 최악의 경우 모든 문자열을 비교해야 하기 때문에 O(리스트에 들어있는 모든 문자열의 총 길이) 만큼의 시간 복잡도가 들게 된다. 이는 문자열 간의 불필요한 비교를 계속 진행하기 때문에 상당히 비효율적인 방법.. 2021. 6. 30.
맵(Map) & 셋(Set) JAVA에는 해싱을 활용한 자료구조로 대표적으로 Map, Set, 2개가 존재한다. 이 자료구조들은 이전에 배웠던 자료구조와는 다르게 특수한 형태의 자료구조이며, 굉장히 유용하게 쓰이기 때문에 알아놓으면 좋을 것이다. Map은 키(Key)와 값(Value)의 쌍으로 이루어진 데이터의 집합이다. 순서가 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다. JAVA의 Map 인터페이스를 구현한 클래스는 굉장히 많지만 대표적으로 HashMap, HashTable, TreeMap, LinkedHashMap 4가지가 있다. ​ Hashtable HashMap보다는 느리지만 동기화가 지원된다. 키와 값으로 null이 허용되지 않는다. ​ HashMap 중복을 허용하지 않고 순서를 보장하지 않는다. .. 2021. 6. 30.
백준 5719 : 거의 최단 경로 https://www.acmicpc.net/problem/5719 5719번: 거의 최단 경로 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 장소의 수 N (2 ≤ N ≤ 500)과 도로의 수 M (1 ≤ M ≤ 104)가 주어진다. 장소는 0부터 N-1번까지 번호가 매겨져 있 www.acmicpc.net [ 문제풀이 ] 한 정점에서 다른 한 정점으로 가는 최단 경로를 구하는 것이기 때문에 다익스트라 알고리즘을 사용하면 된다. 초기에는 다익스트라로 최단 경로를 구한 후 최단경로가 갱신될 때까지 간선 제거+다익스트라를 반복하였다. 하지만 최단 경로가 2개 이상인 경우 문제가 발생하였다. 위와 같은 경우 하나의 최단 경로 간선을 제거한다면 두 번째 다익스트라에서 1->4-.. 2021. 6. 30.
해싱 : Hashing 대부분의 탐색 방법들은 탐색 키를 저장된 키값과 반복적으로 비교함으로써 탐색하고자 하는 항목에 접근한다. 이에 반해 해싱은 키값에 직접 산술적인 연산을 적용하여 항목이 저장되어 있는 테이블의 주소를 계산하여 항목에 접근하는 방법이다. 키값의 연산에 의해 직접 접근이 가능한 구조를 해시 테이블(Hash Table), 해시 테이블을 이용한 탐색을 해싱(Hashing)이라 한다. 기존의 탐색 방법들은 정렬의 유무에 따라 O(N), O(log N)이 있었다. 해싱은 이론적으로 O(1)의 시간 안에 탐색이 가능한 방법이다. 해싱은 배열을 사용하여 자료를 저장한다. 배열은 단점도 있지만 원하는 항목이 저장된 위치를 알고 있다면 매우 빠르게 자료를 삽입하거나 꺼낼 수 있는 장점이 있는 자료구조이다. 그렇다면 배열의 .. 2021. 6. 30.
그래프(Graph) 그래프(Graph)는 연결되어 있는 객체 간의 관계를 표현할 수 있는 트리(Tree)와 같이 비선형 구조를 가지는 자료구조이다. 대표적인 예로는 지도가 있다. 그래프는 정점(Vertex)과 간선(Edge)들의 집합으로 구성된다. 수학적으로는 G = (V, E)로 표시한다. 정점(Vertex)는 여러 가지 특성을 가질 수 있는 객체를 의미하고, 간선(Edge)는 이러한 정점들 간의 관계를 의미한다. 정점은 노드라고도 불리며, 간선은 링크라고도 불린다. 그래프는 간선의 종류에 따라 무방향 그래프(Undirected Graph)와 방향 그래프(Directed Graph)로 구분된다. 무방향 그래프의 간선은 간선을 통해서 양 방향으로 갈수 있음을 나타내며 정점 A, B를 연결한 간서은 (A, B)로 표현한다. .. 2021. 6. 30.
반응형