알고리즘 23

[Algorithm] C - 해시 테이블(Hash Table)

요약 해시란 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑한 값을 말함 해시 테이블이란, 키와 밸류를 한 쌍으로, 해싱 함수에 따라 효율이 달라짐 충돌이란 데이터를 넣어야 할 주소에 이미 다른 값이 저장되어 있는 현상을 말하며 충돌 시 체이닝 기법을 적용함 체이닝이란 해시 함수가 충돌이 발생하면, 각 데이터를 해당 주소에 있는 링크드 리스트로 삽입하여 문제를 해결하는 기법을 말함 체이닝의 성능 개선으로 선형 탐사, 제곱 탐사, 이중 해싱 등이 있음 제일 좋은 성능은 이중 해싱으로, 해싱 함수를 두 가지를 두고, 충돌 시 두 번째 해싱 함수를 사용 해시(Hash) 해시란 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑(Mapping)한 값이다. 즉, 해시는 데이터를 입력받아 ..

Algorithm/이론 2022.12.12

[Baekjoon] C++ 1920번 - 수 찾기 (Silver 4)

1929번: 수 찾기 시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 128 MB 173155 51786 34391 29.842% N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오. 입력 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다. 출력 M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다. 예제 입력..

Algorithm/Baekjoon 2022.12.05

[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 - 이진 탐색 트리(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++ - 소수 구하기 (제곱근, 에라토스테네스의 체)

소수(Prime Number)란 소수란 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수를 말한다. 아래 표는 100 이하의 소수를 나타내는 표로, 1과 자기 자신 말고 약수가 존재하지 않는다. 총 3가지의 방법으로, 일반 반복문, 제곱근, 에라토스테네스의 체를 이용한 방법을 설명한다. 1. 모든 경우의 수를 전부 나누는 방법 O(n) 이 경우는 판단하는 수를 2부터 그 수까지 모두 나누는 방법이다. 모든 값을 하나하나 약수가 있는지 판단하는 알고리즘으로 구현은 쉽지만 시간 복잡도가 O(n)으로 가장 비효율적이다. bool PrimeNumber(int number) { for(int i = 2; i < number; i++) { // 1개라도 나누어 떨어지면 약수가 존재하므로 false if(n..

Algorithm/이론 2022.11.20

[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