라벨이 Cpp인 게시물 표시

시간복잡도 (Time Complexity), Big-O

이미지
개요 우리가 작성한 코드는 실행시간이 얼마나 걸릴까요? 🤔 컴퓨터는 매우 빠르지만 계산이 복잡하거나 데이터의 양이 많다면 결과를 얻는 시간은 점차 길어질 것입니다. 예를 들면 무작위의 수 5개 중에서 "어떻게 하면 가장 큰 수를 찾을 수 있을까?" 를 고민하는 것을 알고리즘 (algorithm) 이라고 합니다. 알고리즘 : 문제를 해결하기 위한 방법이나 절차   Big-O 표기법 큰 수를 찾는 알고리즘에서 만약 그 수열이 1, 2, 3, 4, 5 와 같다면 가장 처음 만나는 수1을 기록하고 그 다음 수와 비교해가며 큰 수를 만나면 바꿔 기록하는 것이죠. 결국 우리는 수열의 크기인 다섯번을 반복하면 가장 끝에서 만난 5가 가장 큰 수라는 결과를 얻게 됩니다. 다섯번을 반복해 5가 가장 큰 수임을 찾았으니 위 알고리즘을 푸는데 걸린 시간은 5회 라고 볼 수 있습니다. 그것을 시간복잡도 라고 하고 Big-O 표기법 으로 O(5) 라고 합니다.   시간복잡도 : 알로리즘을 수행하는데 걸리는 시간의 양   만약 수열이 5, 4, 3, 2, 1의 순서로 나열되어 있더라도 가장 끝수인 1까지 가야만 첫 수인 5가 가장 크다는 것을 확신 할 수 있으므로 O(5) 입니다. 좀 더 수학적인 표현으로 수열의 크기(n)이 5와 같으므로 O(n) 이라고 할 수 있습니다. 왜 하필 용어가 Max-O도 아니고 Long-O가 아닌지는 너무 고민하지 말고 표준(Standard, 남들이 다 쓰는 말)으로 받아들이면 됩니다. 시간복잡도라는 용어가 조금 이해가 된다면 좀 더 다양한 시간복잡도들을 예시와 함께 살펴보겠습니다. O(1) 시간 복잡도 좀전에 O(n)으로 하자더니 갑자기 O(1)은 뭔가 혼란스럽네요.😩 서로 다릅니다. 예제를 보면서 설명하겠습니다. #include <iostream> using na

Qt6기반 소켓프로그래밍 (채팅앱)

이미지
들어가며 2020년쯤에 작성된 " MFC 기반 소켓 프로그래밍 " 예제가 있습니다. 

Google Maps API 를 활용한 REST앱

이미지
개요 Google Maps API 중 Static Map 을 이용, 지도이미지를 온라인으로 다운 받아 출력하는 예제입니다. 사용법은 구글지도를 웹브라우저에서 사용하는 방식과 유사합니다. 이전에 작성된 게시물 중 Python 으로 작성된 예제 와 동일하며, C++ 로 만들어 보았습니다. 동작 방식은 아래의 동영상과 캡쳐이미지를 참조 바랍니다. 완성본 앱 이미지 Google Static Map Google Static Map API 는 구글지도 서비스를 이용할 수 있는 API 함수 를 제공하는 것을 말합니다. 웹브라우저, 구글앱으로 구글지도를 사용하는 것은 무료지만, 지도 API를 내 앱에서 활용하는 본 예제같은 서비스는 유료이며 사전에 GCP ( G oogle C loud P latform)에 해당 서비스를 신청하고 결제 정보를 연동해 두어야 합니다. GCP (링크) 에서 제공되는 방대한 서비스(A.I, DB, 머신대여, 스토리지, 지도 등)  중 내게 필요한 서비스를 신청 후, API Key 를 받을 수 있으며, 해당 키가 있어야만 API 호출이 가능합니다. 아래는 구글의 소개자료 입니다.  보다 자세한 내용은 구글 소개자료 링크 를 참조 바랍니다. Google Developer Guide 비용은 대략 1000번의 이미지 호출당 US 2$ 정도의 비용이 발생합니다. 더 많이 사용하는 경우는 약간 저렴하고 매우 많이 사용하는 경우는 별도의 비용으로 책정한다고 합니다. Pricing 정책

Qt6 기반의 Tetris(테트리스) 게임앱

이미지
개요 이전 게시물과 동일하지만 C++ 언어로 만든 테트리스 게임 입니다. 파이썬 버전과 최대한 동일하게(변수, 함수, 클래스명 등) 만들어져 있으므로 코드 설명은 이전 게시물 참조 바랍니다.

Qt6기반 Android게임 개발환경 구축

이미지
개요 약 3년 전 C++언어로 Qt, Android 개발환경 구축 을 소개한 글이 있었습니다. 참조 : C++, Qt Android App 개발 (이전 글)   세월이 지나 최근 C++ Qt 환경에서 Android 배포용 앱을 만들다 보니 기존과 변경된 부분이 있어 정리해두고자 합니다. 이 글은 Windows 11 에서  Qt Creator, C++ , Cross Platform 을 활용해 Android Device 용 앱을 개발하고 업로드하는 과정을 담고 있습니다.

C++11의 표준 동시성 라이브러리에 대한 이해

이미지
개요 이번 주제는 C++ 코드 실행의 Synchronous(동기) vs Asynchronous(비동기) 에 대한 기록입니다. 동기화된 프로그래밍은 어떤 한 작업이 완료될 때까지 다른작업은 수행되지 않고, 비동기는 그 반대입니다.

컴퓨터의 수치연산원리, Infix to Postfix에 대한 이해

이미지
개요 안녕하세요. 중위 표기법(infix) 으로 표현된 수식을 후위 표기법(postfix) 로 바꾸는 C++ 계산기입니다.   1. 문자열로 중위표기법 입력 ( A-Z, a-z, 0~9,+,-,*,/,^,(,) )   2. 피연산자 (A-Z, a-z, 0~9) 는 후위식 문자열에 저장   3. 열리는 괄호 '(' 는 Stack에 저장   4. 닫기는 괄호 ')' 만나면 다음 '(' 만나기 전까지 Stack Pop 수행, 후위식 문자열에 저장   5. 연산자는 Stack에 추가 우선순위가 높은 연산자는 Stack Pop 수행, 후위식 문자열에 저장 개발 환경 C++17, Qt Creator 9.0.1, MinGW 11.2.0 64bit Windows 11 Pro   calc.h #ifndef CALC_H #define CALC_H #include <string> class Calc { public: Calc(const std::string& exp); ~Calc(); private: const unsigned int MAX; std::string infix; int priority(char c); public: std::string infixToPostfix(); int calcPostfix(const std::string& exp); }; #endif // CALC_H   calc.cpp #include "calc.h" #include <iostream> #include <cstring> #include <stack> #include <cmath> using namespace std; Calc::Ca

가장 빠른 검색, 이진탐색트리(BST) 구현 및 이해

이미지
개요 안녕하세요. C++ 자료구조 (Data Structure) 중 검색에 특화된 BST ( B inary S earch T ree)를 구현한 예제입니다. Root 기준으로 작은 값은 왼쪽, 큰값은 오른쪽, 중복허용X 연결리스트 (Linked List) 로 구성 삽입, 순회, 검색, 삭제 가능 노드 삭제 시 자식노드의 수 (0, 1, 2) 에 따라 삭제법이 다름에 유의   Visualization Link : https://www.cs.usfca.edu/~galles/visualization/Algorithms.html   개발 환경 C++17, Qt Creator 9.0.1, MinGW 11.2.0 64bit Windows 11 Pro   bst.h #ifndef BST_H #define BST_H struct Node { Node(int _v=0, Node *_L=nullptr, Node *_R=nullptr) : v(_v), L(_L), R(_R) {} int v; Node *L, *R; }; class BST { public: BST(); ~BST(); private: Node *pRoot; public: inline Node* root() {return pRoot;} void insert(int v); void preorder(Node *); void inorder(Node *p); void postorder(Node *p); Node* search(Node *p, int v); void remove(int v); private: Node* insert(Node *p, int v); void deleteNode(Node *p); Node* remove(No

Stack 자료구조 직접 구현하기

이미지
개요 안녕하세요. C++ 자료구조 (Data Structure) 의 가장 기본인 Stack 을 구현한 예제입니다. 마지막에 들어간 값이 먼저 나오는 LIFO (Last In First Out) 구조. 배열 (Array) 로 구성 Push, Pop 이 일어날 때 배열의 값이동(X), 인덱스 (top) 이동(O) 생성자에서 동적할당하는 클래스는 복사생성자, 대입연산자를 따로 정의 ( Queue 예제를 참조 하여 Do it yourself. 아래 예제에서 생략) 개발 환경 C++17, Qt Creator 9.0.1, MinGW 11.2.0 64bit Windows 11 Pro   stack.h #ifndef STACK_H #define STACK_H const int MAX = 5; class Stack { public: Stack(int _size=MAX); ~Stack(); public: void push(int v); int pop(); void print(); inline int length() {return size;} private: bool isFull(); bool isEmpty(); private: int top, size; int *p; }; #endif // STACK_H stack.cpp #include "stack.h" #include <iostream> #include <cstring> using namespace std; Stack::Stack(int _size) : top(0), size(_size), p(nullptr) { cout << "Contructor" << '\n'; p = new int[size];

Queue 자료구조 직접 구현하기

이미지
개요 안녕하세요. C++ 자료구조 (Data Structure) 의 가장 기본인 Queue 를 구현한 예제입니다. 먼저 들어간 값이 먼저 나오는 FIFO (First In First Out) 구조. 배열 (Array) 로 구성 Push, Pop 이 일어날 때 배열의 값이동(X), 인덱스 (head, tail) 이동(O) 생성자에서 동적할당하는 클래스는 복사생성자, 대입연산자를 따로 정의 개발 환경 C++17, Qt Creator 9.0.1, MinGW 11.2.0 64bit Windows 11 Pro   queue.h #ifndef QUEUE_H #define QUEUE_H const int MAX = 5; class Queue { public: Queue(int _size=MAX); ~Queue(); Queue(const Queue& other); Queue& operator=(const Queue& other); private: int size; int head, tail; int *p; public: void print(); void push(int v); int pop(); }; #endif // QUEUE_H queue.cpp #include "queue.h" #include <iostream> #include <cstring> using namespace std; Queue::Queue(int _size) : size(_size), head(0), tail(0), p(nullptr) { cout << "Constructor" << '\n'; p = new int[size]; memset(p

C++ 동적메모리 할당으로 런타임메모리 관리

이미지
개요 C++ 배열을 이용한 동적메모리 할당 (Dynamic Allocation) 구현 예제 입니다. 런타임 에 메모리를 어떻게 관리하는지 공부해 봅시다. 최초 5개의 정수형 배열을 Heap 영역에 동적할당하고, 저장공간이 부족한 경우 2배로 배열의 크기를 늘려가는 방식입니다. [배열의 동적할당] 동작 순서 1. 처음 배열 5개를 생성하고, 데이터를 삽입 2. 데이터가 5개를 초과하면 새로운 배열을 2배 크기(10개)로 동적할당     3. 기존 배열의 데이터를 새 배열로 복사 후 신규 데이터는 새 배열에 저장 4. 기존 배열 (5개) 을 삭제하고 새 배열의 주소를 포인터에 저장 소스코드 #include <iostream> #include <cstring> using namespace std; int main() { int size = 5; int pos = 0; int *p = new int[size]; memset(p, 0, sizeof(int)*size); while (true) { cout << "Input number(Exit:0): "; int n; cin >> n; if (n==0) break; if(pos>=size) { size *= 2; int *p2 = new int[size]; memset(p2, 0, sizeof(int)*size); for(int i=0; i<size/2; i++)

Qt6 기반의 T-Rex 게임 만들기

이미지
개요 이전 게시물인 파이썬기반 T-Rex 게임의 C++ 버전 입니다. 동작방식은 기존의 파이썬 버전 (PyQt) 과 동일하며, Qt 기반으로 작성되어 있습니다. [ C++로 만든 T-Rex Game ]  

정보올림피아드 (햄버거 문제)

이미지
개요 안녕하세요.  학원생 중 정보올림피아드 대회를 준비하는 심화반 학생이 있어 같이 풀어본 문제입니다. 먼저 문제를 살펴보겠습니다. [출처 : 한국정보올림피아드, 2020년 중등부 2교시 문제]   예를 들어 입력 이 아래와 같다면, 12 1 HPHPHPHHPPHP 출력 은 아래와 같아야 합니다. 5   K가 2 라면 (햄거버를 먹을 수 있는 거리), 12 2 HPHPHPHHPPHP 출력 은 아래와 같아야 합니다. 6 문제풀이 1. 왼쪽부터 HPHPHP... 을 진행하며 P(사람)을 검색. 2. 사람(P)을 찾은 경우, 사람인덱스 기준 -K~+K 까지 햄버거 검색. 3. 햄버거가 있다면 (H를 만나면) 먹고, 햄버거 위치에 먹었다는 표시. (예, 'X') 4. 햄버거를 먹었다는 표시를 하는 이유는, 다음 P(사람)이 이미 먹은 햄버거를 또 먹는 것을 방지.  5. 전체적으로 테이블(HPHPHP...)을 반복하는 루프와 테이블 내 사람(P)를 만났을때 -K~+K를 반복하는 이중 루프로 구현. 6. 단, 테이블의 왼쪽에 사람이 있는 경우 -K가 0보다 작은 경우 , 테이블의 오른쪽 끝에 사람이 있는 경우, +K가 테이블의 길이를 초과 하는 경우를 주의. [햄버거 분배문제 해결 알고리즘]   소스코드 (파이썬) x = input('식탁길이, 선택거리:') y = input('햄버거, 사람 배치(H, P):') xx = x.split(' ') #n:식탁길이, k:거리 n = int(xx[0]) k = int(xx[1]) yy =

C++에서 여러값을 리턴해야 하는 경우

이미지
들어가며 코드를 작성하다 보면 함수에서 여러 값을 리턴해야 하는 경우 를 종종 만나게 됩니다. 예를 들면 두수를 전달받아 덧셈, 뺄셈, 곱셈, 나숫셈을 리턴 (4가지 값) 해주고 싶은 경우도 해당되겠지요. C++ 11이 등장하기 전 여러 값을 함수에서 리턴하는 경우, 구조체 or 클래스 선언하고 값을 리턴 해야 했습니다. 물론 동일한 타입의 여러값들을 리턴한다면 std::vector로 가능하지만 늘 타입들이 같은건 아닙니다.

Qt WebEngine을 활용한 웹페이지 PDF 변환

이미지
들어가며 바로 이전 게시물의 주제가 파이썬을 이용해 " 웹페이지 PDF변환, 인쇄 " 예제 입니다. 이번 예제는 같은 주제를 C++ 로 구현해 보았습니다. 실행시 웹브라우저(X)가 아니라 만든 앱을 이용해 아래와 같이 웹페이지를 표시하고, 이를 PDF 저장 or 인쇄 가 가능합니다. [네이버 페이지 표시] [PDF로 저장된 모습] [웹페이지 인쇄 화면]

std::vector, Iterator 직접 구현하며 이해하기

이미지
들어가며  C++ 표준 라이브러리 (STL) std::vector 는 순차적인 자료(배열)를 저장하는 템플릿 클래스입니다.  처음 프로그래밍을 배우던 시절 수년간 동적 메모리 할당(Dynamic Allocation) 을 오직 new, delete 구문에만 의존해 왔습니다. (STL이 뭔지 몰랐습니다.) 그러던 어느날 std::vector 를 처음 사용해 본 후 그 편리함과 왜 이런 존재를 나는 몰랐지라는 허무함이 공존했던 기억이 납니다. 하지만 new, delete를 다년간 사용하며 배웠던 포인터, 메모리에 대한 깊은 이해 는 현재까지도 프로그래밍 지식의 좋은 밑바탕이 되었음을 스스로 느낍니다. 편리함의 이면 std::vector를 접한 후 대부분의 동적 배열, 동적메모리 할당 은 제 코드에서 사라지게 되었고, 남이 만든 클래스(물론 표준이지만)의 사용법을 배우는 것에만 집착하게 됩니다. "이게 어떻게 만들어져 있지" 보다 "어떻게 이것을 사용하지" 라는 생각만 남아 깊은 공부에 별 도움이 되지 않는 도구의 사용법에만 관심이 있었습니다.  대학시절의 자신에게 돌아간다면, 그건 (사용법은) 별로 중요하지 않다고 말해주고 싶군요. 오히려 " 비슷하게 직접 한번 만들어 보는 것은 어때 " 라고 권해주고 싶습니다. 또한, STL은 C++의 강력한 표준 라이브러리이지만 언제나 사용가능한 것은 아닙니다. (아두이노 IDE는 C++언어를 지원하지만 STL은 사용이 불가, 작은 메모리환경)   std::vector 그럼 직접 나만의 벡터 를 만들어 보겠습니다. 앞으로 소개할 예제는 vector Class, Nested Class로 iterator Class 구현까지 포함한 내용입니다. 물론 표준 라이브러리만큼 훌륭하진 않지만 좋은 공부가 될 것입니다.

중첩(Nested)클래스로 Iterator 직접 구현하기

이미지
C++ STL의 템플릿 클래스들이 제공하는 이터레이터를 직접 구현해본 예제 입니다. 예를 들면, std::vector 의 이터레이터를 다음과 같이 사용합니다. std::vector<int> v; v.push_back(5);  v.push_back(3);  v.push_back(7);  // 이터레이터 선언 std::vector<int>::iterator itr = v.begin(); 직접 템플릿 클래스를 만들고 이를 순회하는 iterator 도 직접 만들어 보는 것이죠. 이진 탐색 트리( B inary S earch T ree, 이하 BST)의 Iterator를 직접 구현 해보고자 하는 학원생이 있어 같이 공부하며 만들어 보았습니다. 이 게시물은 BST의 기본적인 구현을 설명하지 않습니다. 인터넷에 많은 자료가 있으므로 참조하기 바라며, Custom Iterator 의 내용 위주로 설명하겠습니다. 구글 검색으로 아래 사이트의 도움을 많이 받았습니다. 미국 "The Ohio State University, Steven J Zeil" 교수님이 구현한 예제이며, 해당 주제에 대해 잘 정리되어 있습니다. 링크 :  https://www.cs.odu.edu/~zeil/cs361/latest/Public/treetraversal/index.html 아래와 같이 사용합니다.  Main.cpp #include <iostream> #include <string> #include "bst.h" int main() { // int type bst ocs::bst<int> b1; b1.insert(5); b1.insert(3); b1.insert(7); b1.insert(2); b1.insert(10); std::cou

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기