🔓알고리즘18

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.
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.
여러개의 최댓값,최솟값 찾기 C++ 개발환경 >> DevCpp 언어 >> C++11 WinAPI 운영체제 >> Windows10 안녕하세요!!! 이번에는 심심해서 vector에 저장된값에서 여러개의 최댓값과 최솟값을 동시에 찾는 알고리즘을 만들어봤습니다~~~ #include #include #include using namespace std; typedef pair pii; int main(){ vectorans; vectordb; double d; int n,j,s; cin >> n >> s; //원소갯수,구할 최댓값 최솟값의 갯수 if(s*2>n) return 0; for(j=0;j> d; db.push_back(d); } for(j=0;j 2020. 11. 8.
두 점 사이의 거리 구하기 C++ 안녕하세요! 이번에는 알고리즘 관련에 대해서 카테고리를 새로 만들었는데 나중에 C++로 미분 관련 도함수 그래프 그릴 때도 이 카테고리를 사용할 거라서 아예 새로 만들었습니다 [[ 소스코드 ]] #include //C++입출력 #include //vector stl #include //수학관련 함수사용 using namespace std; //std이름공간 선언 typedef pair pii; //타입정의 int main(){ vectorpos1,pos2; //두 지점의 x,y좌표를 저장할 공간 vectorans; //두 지점사이의 거리가 담긴 공간 double n,x1,y1,x2,y2,i; cin >> n; //몇개의 값을 도출할것인지 정하기 for(i=0;i> x1 >> y1 >> x2 >> y2; .. 2020. 10. 16.
파일암호화 Cryptography C++ 시작하기 전 사용한 운영체제는 Windows10이며 IDE는 Devcpp를 사용했고, 언어는 C++11입니다! 안녕하세요! 이번에는 파일을 암호화할수있고, 복호화할수있는 프로그램을 만들었습니다 흐헣!!!! 이번꺼도 만들면서 꽤 재밌었습니다 소켓이랑 더불어 거의비등하게 재밌었던것같아요! 그러면 소스코드와함께 원리설명 바로들어갑니다! [[ 암호화 ]] #include #include using namespace std; int main(){ char *ch; //암호화된 코드를 저장할변수 int encp; //암호화코드 string filename,filename_t,thx; //원래파일이름,암호화된파일이름,암호화됬을때파일확장자이름저장변수 cout 2020. 10. 10.
C++ 피아노 연주 안녕하세요!! 이번에는 백도어만들기 뒤풀이로 간단하게 피아노연주 함수를 만들어봤습니다 혹시 Beep() 이런함수 들어보셨나요? 소리를 출력해주는 함수입니다. 이함수는 #include 헤더파일을 추가하면 정상적으로 작동합니다 사용방법은 Beep(주파수,연주시간) Beep(float,float) 입니다. 하지만 그냥 이렇게사용하면 피아노를 연주하기 힘듭니다 왜냐면 피아노는 옥타브마다 주파수가 다 다르기때문입니다 그래서 사용자가 사용하기 편하게만들어줬답니다. 위에 표는 보시다시피 피아노의 주파수크기를 알려주는 표입니다. 저는 이표에서 특정한 규칙성을 찾았습니다. 바로 n옥타브의 주파수의 음이 (n * 2^n-1)로 규칙적으로 증가하더라구요 이를 바탕으로 옥타브구현 알고리즘을 만들어보았습니다 {{{ 소스코드 }.. 2020. 9. 26.