Meta Segment Anything Model에 GUI 적용하기

이미지
개요 최근 심화반수업을 수강하는 학원생분을 통해 Meta AI (과거 Facebook ) 에서 발표한 SAM ( S egment A nything M odel) 이라는 기술을 알게되었습니다. 

컴퓨터의 수치연산원리, 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...

PyQt5를 이용한 GUI 오목앱 만들기

이미지
개요 오목게임을 파이썬을 이용해 만들어본 예제입니다. GUI 앱 을 처음 시도해보는 초보가가 공부하기 좋은 예제라고 생각합니다.  

가장 빠른 검색, 이진탐색트리(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); N...

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...

PyQt5를 이용한 이메일 클라이언트(다중 계정지원)

이미지
개요 이번에 소개할 예제는 MS 아웃룩 (Outlook)과 비슷하게 만들어본 이메일 클라이언트 입니다. 예제로서 소개하기 위해 아웃룩처럼 복잡한 기능은 빼고, IMAP을 지원하는 이메일 계정에 접속해 메일을 읽어 오는 기능까지만 구현하였습니다. 로그인 부분에서 다수의 이메일 계정을 입력하면 추가로 탭을 구성하고 메일수신이 가능합니다. 먼저 전자메일 서버에 로그인 해야 합니다. 대부분 전자 메일 서버는 IMAP을 지원 하며, 서버에 2단계 인증 및 앱 비밀번호 를 미리 등록해 두어야 합니다. (앱 비번은 로그인 비번 X, 전자메일 전용 비밀번호 O) [ 예) Goggle 보안 - 2단계 인증, 앱 비밀번호 생성 ] 해당 전자메일 전용 앱 비밀번호를 이용해 로그인을 시도합니다. [eMail Account] 전자메일 서버 로그인 후, 읽어들인 전자메일을 QTableWidget 에 표시. [eMail Contents]   유의 사항 본인 메일서버의 IMAP 기능을 활성 화 시킨 후 적용하기 바랍니다. POP3는 지원하지 않으며, IMAP SSL (TLS X)만 읽을 수 있도록 설정해 두었습니다. TLS 암호화를 사용하는 분은 소스코드의 로그인 부분만 수정하면 됩니다. SMTP는 향후 추가할 계획입니다. 예제에서 테스트된 메일 서버는 Naver, Google Gmail 입니다.  ...

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++) ...

Qt Creator 기반 C++개발환경 구축

이미지
개요 안녕하세요. 저는 C++ 개발툴( IDE )을  MS Visual Studio (이하 VS) or VS Code ,  Qt의 Qt Creator (이하 QC) 를 사용 목적에 따라 모두 사용하고 있습니다. GUI가 필요없는 경우는 VS Code, GUI가 필요한 경우는 Qt or MFC 인지 판단해 VS와 QC를 적절히 사용합니다. 오늘은 이 중 Qt Creator 의 설치방법 (Open Source)에 대해 정리해 두고자 합니다.   Qt Creator는 Windows 뿐 아니라 macOS에서도 사용가능 하지만 MS VS에 비해 사용하는 개발자가 적은 듯 합니다. (참고로 MS VS도 macOS에서 사용가능합니다)   Qt Creator 설치 방법 1. Qt 홈페이지 접속 ( 링크 클릭 ) Qt 회원가입 필수 우 상단 Download Try 클릭   2. "Go Open Source" 클릭 설치 전 Qt 라이선스 규칙에 대해 숙지 (GPL, LGPL, Commericial)   3. "Download the Qt Online Installer" 클릭 4. "Download" 클릭   5. 온라인 인스톨러 다운로드 완료 6. 온라인 인스톨러 실행 Qt 회원가입이 되어 있지 않다면 진행 7. 설치 진행 저는 이미 설치해 두어서 유지보수 메뉴가 보입니다 처음 설치한다면 그냥 다음으로 진행   8. 설치 선택 Preview는 향후에 출시될 정식버전을 의미 Qt 정식 버전 중 현재 가장 최신버전인 6.4 선택 컴파일러는 기호에 따라 MSVC, MinGW 중 선택 부가적으로 Android 등 다른 Platfo...

Matplotlib 마우스 이벤트 처리하기

이미지
개요 이번 주제는 Matplotlib 의 마우스 이벤트 처리 에 대해 살펴보겠습니다. 차트를 그리는 예제는 많은데 그려진 차트에 마우스, 키보드 등 이벤트를 처리하는 코드는 찾기가 어려워 공부삼아 만들어 보았습니다. 먼저 완성된 결과물은 아래와 같습니다.   이 예제에서 다루는 Matplotlib Mouse Event 는 다음과 같습니다. Pressed           (Matplitlib callback 이용) Released         (Matplitlib callback 이용) Move             (Matplitlib callback 이용) ContextMenu   (PyQt5 callback 이용) 아래와 같이 차트위 마우스 이벤트 발생시 해당 좌표가 출력되며, 수직선을 변경된 위치로 옮겨 그려주도록 구성하였습니다. [예제 프로그램 실행화면]

이 블로그의 인기 게시물

Qt Designer 설치하기

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