🔓알고리즘19

1부터 n사이의 홀수의 합을 O(1)로 구하는 방법 ( C++ 최적화 기법 ) 갑자기 생각나서 만들어보았습니다. 솔직히 for문으로 1부터 n까지 순회하면서 홀,짝수인지 판별하는것은 구현하기 매우 쉽죠. 하지만, 이랬을때 단점이 n의 수가 커질수록 그 연산시간은 n의 크기에 비례해서 증가한다는 점입니다. 우리는 n의 크기에 영향을 받지않고 항상 같은(짧은)속도로 연산을 하는 방법을 의논하는겁니다. 1부터 n까지의 홀수의 합을 O(1)로 구하는 방법#include using bint = std::int64_t; bint Get_1toN_in_O1(bint n){ bint ncore, ncycle, result; n -= (n & 1) ? 0 : 1; ncore = ((n + 1) >> 1); ncycle = (ncore >> 1); result = (ncycle * (n + 1)) .. 2022. 1. 22.
A* 길찾기 알고리즘 (쉽고 친절한 설명) 🔥 소개 안녕하세요~! 이번에는 길찾기알고리즘하면 제일 먼저 떠올리는 A* 알고리즘에 관하여 이론과 실제 프로그래밍 코드로 실습을 진행하겠습니다. 사실 아시는분은 아시겠지만, 예전에 A* 알고리즘에 관하여 포스팅을 올려놨었는데요.. 일단 그 글은 현재 지웠습니다. 설명이 아예없기때문에.. 지금 봐보니까 진짜 불친절하더라구요...ㅠㅠ 이번 포스팅에서는 매우 자세하고 친절하게 알려드리고 있습니다! 🔥 참고 기본적인 알고리즘의 원리는 GeeksforGeeks 를 참고했습니다. 🔥 A* 알고리즘 필수 단어 A* 알고리즘: 출발 꼭짓점에서부터 목표 꼭짓점까지 가는 최단 경로를 찾아내는(다시 말해 주어진 목표 꼭짓점까지 가는 최단 경로임을 판단할 수 있는 테스트를 통과하는) 휴리스틱기반의 그래프 탐색 알고리즘. 열.. 2021. 11. 21.
C++ | 문자열 안에서 특정 문자열 찾기 안녕하세요!! 이번에는 c++ 문자열 안에서 특정 문자열을 찾는 방법에 관하여 소스코드와 이론을 통하여 설명하겠습니다. 소스코드 #include #include #include std::vector findText(const std::string text, const std::string input){ std::vector result; std::size_t nPos = 0; for(;;){ nPos = text.find(input, nPos); // text[nPos]부터 input이라는 문자열을 찾는다 if( nPos != std::string::npos ) { // 만약 찾았다면 std::string subtext = text.substr(nPos, input.size()); // 문자열쪼개기 st.. 2021. 10. 17.
Softmax function 구현하기 C++ 머신러닝에서 어떠한 여러개의 값이 주어졌을때, 그 여러개의 값중에서 임의의로 고른값을 확률의 수치로써 사용하기위해서 고안된 함수입니다. 예를들어서, 다음과 같은 배열이 있다고할때... [ 2, 3, 5 ] 만약 여기서 "2"를 고를때 전체 배열의 합에서의 확률(차지하는 빈도)의 수치는 몇인가? 에 대한 답을 제시해주는것이 "Softmax function"입니다. 우선 소프트맥스함수는 아래와 같이 생겼습니다. 흠.. 의외로 엄청 심플하게 생겼습니다. 실제 C++코드로 옮기면 다음과 같습니다. #include #include #include // https://www.HostMath.com/Show.aspx?Code=f(sj)%20%3D%20%5Cfrac%7Be%5E%7Bsj%7D%7D%7B%5Csum_%7.. 2021. 10. 11.
행렬곱셈 이론및 실습 c++ 본 포스팅은 행렬곱셈(Matrix Multiplication)에 관한 이론및 c++기반의 실습내용을 포함하고 있습니다. 또한 개인적인 공부차원에서 작성한 글입니다. 참조및 도움 https://ko.wikipedia.org/wiki/%ED%96%89%EB%A0%AC_%EA%B3%B1%EC%85%88 행렬 곱셈 - 위키백과, 우리 모두의 백과사전 행렬 곱셈을 위해선 첫째 행렬의 열 갯수와 둘째 행렬의 행 갯수가 동일해야한다. 곱셈의 결과 새롭게 만들어진 행렬은 첫째 행렬의 행 갯수와 둘째 행렬의 열 갯수를 가진다. 행렬 곱셈(matrix mul ko.wikipedia.org http://mathurl.com/ mathURL mathurl.com 행렬 곱셈이란? 두 개의 행렬에서 한 개의 행렬을 만들어내는 이.. 2021. 10. 9.
삼각형 내부에 존재하는지 점인지 확인하는법 c++ 이번에는 삼각형을 이루는 세개의 꼭짓점을 통해서, 어느 한 꼭짓점 N이 해당 삼각형 내부에 존재하는지 확인하는 알고리즘입니다. 코드는 최대한 가독성을 높여서 만들었습니다. #include struct Coord { int x, y; }; void initialize() { std::cin.tie(0); std::cout.tie(0); std::ios_base::sync_with_stdio(0); } int calcTriangle(Coord A_TRIANGLE, Coord B_TRIANGLE, Coord C_TRIANGLE) { int result = std::abs((A_TRIANGLE.x * (B_TRIANGLE.y - C_TRIANGLE.y)) + (B_TRIANGLE.x * (C_TRIANGLE.y.. 2021. 8. 20.
제곱, 제곱근 구현하기 우선은 제곱근은 바빌론방법을 사용하였고, 제곱은 dp를 사용했습니다. 사실 제곱을 일반적으로 구현하면, 시간복잡도가 O(n)이 되는데, 저가 사용한 방법은 dp입니다. 시간복잡도는 예를들어서, 처음 2의 2제곱을 하면 O(n)이고, 그다음은 2의 e제곱을 하면 시간복잡도는 O(n-e)가 됩니다. 그리고, 이미 제곱했었던 수라면 시간복잡도는 O(1)입니다. 먼저 바빌론방법을 이용한 제곱근을 구하는 함수입니다. #include double squareRoot(double n){ double x = n; double y = 1; double e = 0.000001; while(x - y > e){ x = (x + y) / 2; y = n / x; } return x; } int main() { std::cou.. 2021. 8. 13.
랜덤함수 직접 구현하기 - c++ 이번시간에서는 랜덤 함수를 직접 만드는 방법에 대해서 포스팅하겠습니다. 보통 랜덤값을 구한다고한다면 c에서는 rand(), c++에서는 mt19937을 사용합니다. 이번에는 좀 귀찮고, 졸려서 빠르게 코드만 올리고 빠지겠습니다. 암기요소: 0x7df121, 0x2490f3, 0x9194 #include static std::size_t seed = 0; inline unsigned int GetRandom() { seed = 0x7df121 * seed + 0x2490f3; return seed % 0x9194; } inline void setSeed(std::size_t seeds) { seed = static_cast(seeds); } inline int getRandomNumber(int min, .. 2021. 8. 10.
최단거리 경로탐색 프로그램 다운로드및 설명 velog에다가 벨만-포드 알고리즘을 이용한 단방향 그래프 최단거리 경로탐색 프로그램에 대한 글올렸습니다. C# winform으로 만들어서 프로그램도 공유중입니다! https://velog.io/@dpmawile/bellmanford-pathfinding 최소비용 경로탐색 : 알고리즘 노트 벨만-포드 알고리즘을 이용한 최단비용 경로탐색 알고리즘에 대한 개인적인 알고리즘노트입니다. velog.io 2021. 8. 5.
나눗셈 연산속도 최적화 C++ 개발환경 >> Devcpp 언어 >> C++17이상 운영체제 >> Windows10 home 💉개요 안녕하세요! 이번에는 나눗셈연산을 비트연산으로 바꾸는 방법들에 대하여 알아보겠습니다. 우선 왜 나눗셈연산을 비트연산으로 바꾸는건가? 나눗셈연산은 곱셈, 덧셈, 뺄셈, 비트연산속도보다 매우느립니다. 만약에 프로그램속도를 최적화하기 위해서는 비트연산으로 바꿔야합니다. 그래서 이번에는 비트연산으로 바꾸는 여러가지 방법에 대하여 알아보겠습니다. 💉참조 https://stackoverflow.com/questions/5558492/divide-by-10-using-bit-shifts Divide by 10 using bit shifts? Is it possible to divide an unsigned intege.. 2021. 8. 2.
알고리즘 문제풀이 캡슐코드 알고리즘 문제풀때 객체화해서 쉽게 쓸수있는 기본 캡슐코드입니다. #include //Static variables constexpr int MAX = 101; constexpr int INF = 987654321; //AlgoCapsule class AlgoCapsule { public: void Run() { Input(); Solve(); Output(); } void Input() { } void Solve() { } void Output() { } AlgoCapsule() { } private: int answer = 0, N, M; }; //Module Entry int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.. 2021. 7. 22.
계산기 만들기 c++ 계산기 만들기에 대한 내용, 벨로그에 포스팅했습니다. 티스토리 접은건아닙니다!! 벨로그가 뭔가 디자인이 깔끔해서 포스팅할맛나긴하네요! :D https://velog.io/@dpmawile/calculator 계산기 만들기 c++ 계산기 만들기 velog.io 2021. 7. 13.
네트워크 유량 알고리즘 Network flow [ C++20 / Algorithm ] 개발환경 >> Visual Studio 2022 언어 >> C++20 운영체제 >> Windows10 [ 참고자료 ] 안녕하세요!!! 이번에는 네트워크 유량에 관한 알고리즘을 객체화해보았습니다.' 바로 시작하겠습니다! [ 네트워크유량 알고리즘 network flow algorithm ] 우선은 네트워크유량 알고리즘이란? 각각의 변(edge)에 정해진 용량(capacity)보다 작은 흐름(flow)이 주어진 방향 그래프 라고 합니다!! 다음과 같은 그래프가있을때..! 'A'에서 'H'로 가는데 최대한으로 보낼수있는 유량은 몇일까요? (그림에서 빠뜨렸는데, B -> C로 가는 용량은 4입니다.) 다음에서 나와있는 숫자는 그 간선으로 데이터를 보낼수있는 총 용량 이며, 용량이상으로는 유량의 데이터를 보내지못합.. 2021. 6. 19.
드래곤알고리즘 <v1.0.0> C++ 라이브러리 배포 개발환경 >> Visual Studio 언어 >> C++17이상 운영체제 >> Windows10 안녕하세요!! 이번에는 여러가지 알고리즘을 앞으로 천천히 하나씩 넣어볼 라이브러리입니다~! 말그대로 여러가지 알고리즘이 들어가있는 c++17이상의 라이브러리입니다. 현재 추가해 놓은 알고리즘은 다익스트라 알고리즘(Dijkstra), 크루스칼 알고리즘(Kruskal)이 들어있습니다. 추후에 알고리즘은 천천히 하나씩 추가해나가겠습니다. 본 라이브러리의 제작목적은 개인공부입니다. 정적라이브러리를 만들어서 배포하는연습+여러가지 알고리즘공부 입니다. 최근에 알고리즘에 관해서 관심이 생겨서 이론을 공부한뒤, 만들어봤습니다. 라이브러리 다운로드 https://github.com/DRAGONPROCESS/DragonAlgo.. 2021. 6. 5.
split 함수 구현 - C++ 개발환경 >> vscode 언어 >> C++17 운영체제 >> Windows10 안녕하세요 이번에는 split 함수뿐만 아니라 split관련 추가 기능에 대한 헤더 파일을 만들었습니다 그럼 시작하겠습니다...! [[[ 소스코드 ]]] #include "split.hpp" //다운로드는 밑에링크 올려놓았습니다 #include int main(){ string str="1|2|3|4"; //string split::splitC spl; //splitC클래스 spl = split::split(str,"|"); //split함수 for(int i=0;i 2020. 12. 2.