본문 바로가기

컴퓨터공학/자료구조

(7)
이진 탐색 트리에서 전체 방문하는 방법은?(Pre-Order, In-Order, Post-Order, Reverse In-Order) Q. 이진 탐색 트리에서 전체 방문하는 방법은? CS 지식을 묻는 시험에서 자주 나오는 문제이다, 재귀적인 구조를 이해한다면 쉽게 답을 유추할 수 있다. 각 Order의 주체가 되는 것은 루트 노드라는 것을 잊지 않으면 된다. Pre-Order은 루트 -> 왼쪽 서브트리 -> 오른쪽 서브트리 순으로 방문한다. In-Order은 왼쪽 서브트리 -> 루트 -> 오른쪽 서브트리 순으로 방문한다. Post-Order은 왼쪽 서브트리 -> 오른쪽 서브트리 -> 루트 순으로 방문한다. 각 노드의 방문 순서를 출력할 수 있는데, 루트 노드의 위치에 printf를 호출해주면 된다. Q. 부모 노드를 출력하는 것이 모든 노드의 순서를 볼 수 있을까? 어떤 노드든 루트 노드가 될 수 있다. (물론 모든 트리에서 루트 노드..
정렬별 시간복잡도를 생각해보자(Bubble Sort, Selection Sort, Insertion Sort, Quick Sort, Merge Sort, Heap Sort, Time Complexity) Q. 정렬의 종류는 무엇이 있을까? 종류들을 나열하고, 간단하게 알고리즘에 대해서 설명하겠다. 오름 차순 정렬 기준으로 설명하겠다. 버블정렬 : 순차적으로 근접한 두 값을 비교하면서, 마지막에 거품(Bubble)처럼 하나의 값을 얻게 된다. 같은 과정으로 하나의 값들을 얻어보면 정렬할 수 있다. 선택정렬 : 선택정렬은 전체의 원소에서 가장 작은 값을 순차적으로 찾아가면서 정렬한다. 삽입정렬 : K번째 원소의 위치를 찾을 때, 1부터 K-1까지는 모두 정렬이 되어 있으므로, K -1번째부터 값을 비교하며 위치를 찾으면서 정렬한다. 퀵정렬 : 피벗을 선택하고, 피벗을 기준으로 왼쪽에는 피벗보다 작은 값이 오른쪽에는 피벗보다 큰 값이 오도록 한다. 재귀적으로 호출하며 모든 원소들을 정렬한다. 합병정렬 : 재귀..
힙 트리란 무엇일까(Max, Min Heap Tree) Q. 힙 트리의 정의는 어떻게 되어있을까? Max Heap Tree의 경우, 모든 부모노드는 자식 노드보다 커야 한다. 따라서, 루트 노드는 모든 노드들보다 큰 상황이다. 반정렬상태를 유지한다고 표현하기도 한다. 힙 트리는 또한 항상 Complete Binary Tree 형태를 이룬다. Binary의 의미는 자식 노드가 2개임을 의미한다. Complete는 트리의 높이가 H일 때, 전체 자식 노드의 개수는 2^(H - 1)보다 같거나 크고, 2^H - 1보다 같거나 작은 것을 의미한다. 따라서 어떤 탐색이든 O(logH)만에 가능하다고 표현하기도 한다. Q. 힙 트리는 어떻게 구현할까? 어떤 부모노드의 인덱스가 i라고 하면, 왼쪽 자식 노드는 2 * i, 오른쪽 자식 노드는 2 * i + 1라고 표현할 ..
[JAVA] 알고리즘에서 자주 쓰이는 자료구조 정리(예제, 사용시기, 백준, 프로그래머스, 필수 자료구조) ## Stack - 순차적으로 데이터를 접근하면서, 이전 데이터와 신규 데이터가 같을 때 연산이 이루어지는 문제에서 사용 - 중복 허용한다. * 예제 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import java.util.*; import java.lang.*; import java.io.*; class Main { public static void main (String[] args) throws java.lang.Exception { Stack stk = new Stack(); if(stk.empty()){ stk.push(1); stk.push(2); stk.push(3); } if(!stk.empty()){ i..
[C++] 우선순위큐 구조체 사용하는 법, 알고리즘, 이론 알고리즘 문제를 풀다보면, 우선순위큐를 사용할 일이 많다. 우선순위큐의 장점은 원하는 구조체를 선언하고 원하는대로 정렬 방식을 정할 수 있다는 것이다. typedef struct item { string pre; int number; int idx; item(string p, int n, int i) : pre(p), number(n), idx(i) {}; }item; struct cmp { bool operator()(item i1, item i2) { if (i1.pre.compare(i2.pre) == 0) { if (i1.number == i2.number) return i1.idx > i2.idx; else return i1.number > i2.number; } else return i1.pr..
Trie(트라이) 자료구조 정의, 예제 코드 2020 신입 개발자 카카오 블라인드 시험을 치다가, 문자열 처리에 대한 자료구조를 알게 되었다. Trie 자료구조에 대한 다음과 같은 모습으로 생겼다. 위에 보면, APPLE, LABLE, CABLE이라는 단어를 넣은 것이다. 왜 굳이, Trie 자료구조를 사용해야 하는지를 생각해보자. 특정 문자열을 벡터에서 순차적으로 탐색하면, 최대 문자열의 갯수만큼 걸리게 된다. 하지만 Trie 자료구조를 사용하면, 문자열의 길이만큼의 탐색 시간이 걸린다. 즉, 많은 문자열속에서 특정한 문자열을 찾기 위해서는 Trie만한 자료구조가 없다. Trie 자료 구조를 사용하지 않으면, 카카오 블라인드 2020 기출문제 효율성을 통과할 수 없게끔 설계되어 있다. Trie 자료 구조를 몰랐을 때 사용했던 방법은, 문자열을 일..
[C++] Set 자료구조 역순으로 자료 참조하기 프로그래머스 코딩을 하다가, Set 마지막 원소를 참조해서 답을 찾는 문제가 있었다. 이 경우에, 역순 반복자를 쓰면 손쉽게 해결할 수 있다. 다음 예제를 보면 충분히 이해가 갈 것이다. 반복자를 사용하는 모든 자료 구조에서, 마지막 원소를 찾기 위해서 기본 반복자를 사용하지말고, 역순 반복자를 사용하면 O(1)만에 마지막 원소를 찾을 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // set::rbegin/rend #include #include using namespace std; int main() { int myints[] = { 21,64,17,78,49 }; set myset(myints, ..