C언어 17

[Algorithm] C - 수식 트리(Expression Tree)

요약 수식 계산을 위한 트리 구조로 후위 변환 표기식으로 트리를 구축하고, 중위 표기식으로 변환하여 사용 1개의 연산자와 2개의 피연산자를 요구함 피 연산자는 잎 노드임 연산자는 뿌리 또는 가지 노드임 뒤에서부터 역순으로 계산이 되어야 함 뒤에서부터 1개씩 토큰을 확인해 연산자인지 피연산자인지 확인 수식 트리(Experssion Tree) 수식 트리란 이름 그대로 수식을 표현하는 트리이며, 수식 이진 트리라고도 한다. 하나의 연산자가 2개의 피연산자를 취한다는 가정 아래, 수식 트리는 일반적으로 2가지의 규칙을 가진다. 피연산자는 잎 노드이다. 연산자는 뿌리 노드 또는 가지 노드이다. 예를 들어 아래와 같은 수식이 있다. (1 * 2) + (7 - 8) 피연산자 1, 2, 7, 8은 모두 잎 노드이고, ..

Algorithm/이론 2022.12.04

[Algorithm] C - 이진 트리(Binary Tree)

요약 트리 구조에서 하나의 노드가 자식 노드를 2개까지 가질 수 있는 트리 구조 포화 이진 트리와 완전 이진 트리 구조로 나뉨 높이에 따라 높이 균형 트리와 완전 높이 균형 트리 구조로 나뉨 노드 방문 순서에 따라 전위 순회, 중위 순회로 나뉨 트리 소멸 시 잎 구조부터 제거해야 하며 후위 순회 방식으로 제거해야 이진 트리(Binary Tree) 이진 트리란 일반 트리와 개념은 같지만, 하나의 노드가 자식 노드를 2개까지만 가질 수 있다는 점이 다르다. 이진 트리라는 이름도 자식을 둘만 가진다는 의미에서 붙어진 이름이다. 아래 그림이 이진 트리의 구조를 개념적으로 표현한 그림이다. 이진 트리의 종류 이진 트리의 가장 중요한 부분은 노드의 최대 차수가 2라는 사실이다. 즉, 모든 이진 트리 노드의 자식 수..

Algorithm/이론 2022.12.04

[Algorithm] C - 트리(Tree) 자료 구조

트리(Tree)란 트리는 그 이름에서 알 수 있듯이 나무를 닮은 자료구조이다. 실생활에서 이러한 구조를 많이 사용하는데, 의사 결정 트리, 스킬 트리 등 여러 방면으로 많이 사용한다. 컴퓨터 과학에서도 활용도가 매우 높다. HTML, XML 문서를 다룰 때 사용하는 DOM, PC 폴더 구조, 운영체제 파일 시스템 등도 트리 구조로 이루어져 있다. 트리의 구성 요소 트리는 크게 뿌리(Root), 가지(Branch), 잎(Leaf) 세 가지 요소로 이루어져 있다. 뿌리, 가지, 잎은 모두 똑같은 노드이지만 트리에서 어디에 위치하는지에 따라 불리는 이름이 달라진다. 뿌리는 트리 자료구조의 가장 위에 있는 노드를 가리키고, 가지는 뿌리와 잎 사이에 있는 모든 노드를 말한다. 그리고 가지의 끝에 있는(마지막) 노..

Algorithm/이론 2022.12.04

[Algorithm] C - 이진 탐색 트리(Binary Search Tree)

이진 탐색 트리 요약 시간 복잡도 : O(log(n)) ~ O(n) 왼쪽 하위 트리는 루트보다 작은 값이 위치함 오른쪽 하위 트리는 루트보다 큰 값이 위치함 정렬되어 있는 트리 구조에서 빠른 탐색 속도를 보임 한쪽으로 편향되어 있는 트리 구조에서 비효율적임 이진 탐색 트리(Binary Search Tree) 이진 탐색 트리란 트리 내부에 있는 노드의 값을 찾는 방법으로 아래와 같이 3가지의 조건을 만족하면 된다. 각 노드는 왼쪽 자식 노드보다 큼 각 노드는 오른쪽 자식보다 작음 같은 키 값을 갖는 노드는 없음 위 그림은 이진 탐색 트리를 구현한 예이다. 여기서 노드 5를 보면 왼쪽 하위 트리 노드(4, 1)은 모두 5보다 작다. (조건 1번에 해당) 그리고 오른쪽 하위 트리 노드(7, 6, 9)는 모두 ..

Algorithm/이론 2022.12.03

[Algorithm] C - Boyer-Moore 문자열 검색 알고리즘

요약 시간 복잡도 평균 : O(n / m) / 최악 : O(n) 검색하고자 하는 패턴의 마지막 문자부터 앞쪽으로 검사를 진행 일치하지 않는 문자가 있을 경우 Skip 표에 따라 패턴을 옮겨 가면서 검사 각각의 문자를 만났을 때 패턴을 옮길 크기를 저장할 표를 만들어야 함 문자열의 커서는 앞에서 뒤로, 패턴의 커서는 뒤에서 앞으로 역방향으로 검사 Boyer-Moore 알고리즘이란 Boyer-Moore 알고리즘이란 검색하고자 하는 패턴의 마지막 문자부터 앞쪽으로 검사를 진행하면서 일치하지 않는 문자가 있으면 미리 준비한 표에 따라 패턴을 옮길 크기를 정하는 고리즘이다. Booyer-Moore 법은 Brute-Froce나 KMP 보다 효율이 더 우수하기 때문에 널리 사용되는 문자열 검색 알고리즘이다. R.S ..

Algorithm/이론 2022.11.19

[Algorithm] C - KMP(Knuth-Morris-Pratt Algorithm) 알고리즘

요약 시간 복잡도 : 최상 O(mn) 문자열에서 특정 패턴을 미리 찾아내 검색하는 문자열 검색 알고리즘 문자열 검색 시 검사했던 위치 결과를 버러지 않아 효율적으로 검색할 수 있음 문자열 검색 시 불필요한 문자간 비교를 없애기 위해 실패 함수를 사용함 Boyer-Moore 법과 성능이 같거나 좋지 않아 실제로 많이 사용되지 않는 알고리즘 KMP(Knuth-Morris-Pratt Algorithm) 알고리즘이란 KMP 알고리즘이란 문자열 중에서 특정 패턴을 찾아내는 문자열 검색 알고리즘 중 하나이다. 문자열 검색 시 검사했던 위치 결과를 버리지 않고 효율적으로 검색할 수 있는 특징이 있다. 문자열 검색 시 불필요한 문자간 비교를 없애기 위해서 실패 함수를 사용한다. 문자열 검색 방법 아래 예제는 "ZABC..

Algorithm/이론 2022.11.19

[Algorithm] C - 브루트 포스(Brute Force)를 이용한 문자열 검색

요약 시간 복잡도 : 최상 O(n) 최악 O(mn) 브루트 포스 알고리즘이란 완전탐색 알고리즘으로 문제에 나와있는 모든 경우의 수를 시험하는 방법 찾고 싶은 문자열이 있을 때 각각의 문자 하나하나 대조하며 찾아내는 방법 검색할 문자열의 커서와 찾을 문자열의 커서를 두고 한 문자씩 비교 구조가 간단하여 구현 및 이해가 쉽지만 비효율적 알고리즘 브루트-포스법(Brute force) 알고리즘 브루트 포스 알고리즘이란 완전탐색 알고리즘으로 문제에 나와있는 모든 경우의 수를 시험하는 방법이다. 문자열을 검색하는 가장 기초적인 알고리즘으로 꼽히며 찾고 싶은 문자열이 있을 때 하나하나 대조하며 찾아낸다. 브루트 포스 알고리즘은 구조가 간단하여 구현 및 이해가 쉽지만 비효율적 알고리즘이다. 아래 예제는 문자열 "ABA..

Algorithm/이론 2022.11.14

[Algorithm] C - 퀵 정렬(Quick Sort)

요약 시간 복잡도 : O(n log n) ~ O(n ^ 2) 정렬할 데이터에서 피벗을 기준으로 두 개의 비균등한 크기로 분할하는 작업을 반복 피벗 이하의 그룹과 이상의 그룹이 왼쪽, 오른쪽으로 분리되었을 경우 배열을 다시 분할 요소가 1개가 되었을 때 분할을 멈춤 퀵 정렬(Quick Sort) 퀵 정렬이란 정렬할 데이터에서 피벗(pivot)을 기준으로 두 개의 비균등한 크기로 분할하고 분할된 부분 리스트를 정렬하는 알고리증믈 말한다. 퀵 정렬은 가장 빠른 정렬 알고리즘으로, 찰스 앤터니 리처드 호어(C. A. R. Hoare)가 붙인 이름으로, 속도가 빠른 만큼 많이 사용되는 정렬 알고리즘이다. 만약 어떤 학생 그룹이 있고, 수가 8명이며 키 순서대로 정렬해야 되는 구조가 있다. 먼저 임의의 학생 A를 ..

Algorithm/이론 2022.11.14

[Algorithm] C - 이진 탐색(Linear Search)

요약 시간 복잡도 : O(log N) 데이터의 중간 값을 확인해 검색 범위를 반씩 좁혀가는 검색하는 검색 알고리즘 오름차순 또는 내림차순으로 정렬된 데이터 구조에서만 사용할 수 있음 검색이 반복될 때마다 검색 범위가 반으로 좁혀지므로 검색 속도가 빠름 검색 범위를 맨 앞, 맨 끝, 중앙 요소로 두고 중앙 요소의 값으로 학인함 이진 탐색(Binary Search) 이진 탐색이란 데이터가 오름차순 또는 내림차순으로 정렬되어 있을 때 검색하는 정렬 알고리즘이다. 이진 탐색은 정렬되지 않은 데이터에서는 사용할 수 없으나, 선형 검색보다 빠르게 검색할 수 있는 장점이 있다. 데이터의 중간 값을 확인해 검색 범위를 반씩 좁혀가며 검색하는 구조를 가지고 있다. 먼저 정렬된 배열이 있다고 가정한다. [5, 7, 15,..

Algorithm/이론 2022.11.14

[Algorithm] C - 선형 검색(Linear Search)

요약 시간 복잡도 : O(n) 검색 방법 중 가장 단순하여 구현이 쉽움 정렬되지 않은 데이터 구조에서도 사용 가능 길이가 길수록 비효율(모든 데이터 검색 필요) 선형 검색(Linear Search)이란 선형 검색이란 데이터가 모인 집합(배열, 링크드 리스트 등)에서 원하는 키 값을 갖는 요소를 만날 때까지 맨 앞부터 순서대로 검색하여 찾는 검색 알고리즘을 말한다. 다른 말로 순차 검색(Sequential Search)라고도 한다. 검색하고자 하는 데이터 집합이 있다고 가정한다. 이 배열에서 2라는 값을 찾기 위해 0번 인덱스 요소부터 차례로 검색한다. 위 배열에서는 2라는 값을 찾기 위해 4번의 검색으로 발견하였다. 첫 번째 인덱스 값 6 확인, 원하는 값이 아님 두 번째 인덱스 값 4 확인, 원하는 값..

Algorithm/이론 2022.11.14