no image
백준 2109번 순회강연 [C/C++]
첫 번째 시도 방식 (X)day를 기준으로 오름차순을 하고, 같은 날에선 가격을 기준으로 내림차순 하여 가능한 업무를 처리. 반례는 있다고 인지했지만, 다른 방식이 떠오르지 않아 먼저 해당 방식으로 구현해보았다.#include using namespace std;int n, p, d;int dayCount = 1;int ret;vector> v;bool cmp(pair a, pair b) { if (a.second b.first; } else { return false; }}int main(){ cin >> n; for (int i = 0; i > p >> d; v.push_back({ p, d }); } sort(v.begin(), v.end(), cmp); for (int i = 0; i ..
2025.05.23
[QT] QOpenGLShaderProgram의 addShaderFromSourceCode 메서드
QOpenGLShaderProgram이 클래스는 GLSL과 GLSL/ES로 작성된 셰이더 프로그램을 지원한다. QOpenGLShader와 QOpenGLShaderProgram은 vertex shader와 fragment shader를 컴파일하고 링킹하는 세부 작업들로부터 프로그래머를 보호해준다. 다음 예제는 제공된 셰이더 소스코드를 사용하여 버텍스 셰이더 프로그램을 생성하는 것이다. 컴파일 및 링크가 완료되면 셰이더 프로그램은 QOpenGLShaderProgram::bind():를 호출하여 현재 QOpenGLContext에서 활성화된다.QOpenGLShader shader(QOpenGLShader::Vertex);shader.compileSourceCode(code);QOpenGLShaderProgram..
2025.05.18
QT
no image
[OS] 프로세스와 메모리 레이아웃
프로세스프로세스 개념운영 체제에 대해 이야기 할 때 제기되는 질문중 하나는 CPU가 수행하는 모든 활동을 무엇이라고 부를 것인가이다. 초기 컴퓨터는 job을 실행하는 일괄 처리(batch) 시스템이었지만, 이후 user program, 또는 task를 실행하는 시분할 시스템이 등장했다. 오늘날 단일 사용자 시스템에서도 사용자는 워드 프로세서, 웹 브라우저, 이메일 패키지 등 여러 프로그램을 동시에 실행할 수 있다. 멀티태스킹을 지원하지 않는 임베디드 장치처럼 컴퓨터가 한 번에 하나의 프로그램만 실행할 수 있더라도, 운영 체제는 메모리 관리와 같은 자체적인 내부 프로그래밍 활동을 지원해야 할 수 있다. 많은 측면에서 이러한 모든 활동은 유사하므로, 이 모든 활동을 프로세스(process)라고 부른다. 조금..
2025.05.09
[C++] std::array
std::arrayC++ 11에 추가된 std::array는 에 정의되어 있다. C 스타일의 배열과 다른 점은 배열의 이름이 `T*`로 자동 형변환 되지 않는다. C 스타일의 배열을 사용하게 되면 함수 매개변수에 집어넣었을 때, 포인터로 강제 변환되어 배열의 크기가 날라가는 불편한 점도 초래한다. 배열 크기가 소멸되는 이유는 `int arr[]`처럼 함수의 매개변수를 설정하더라도, 함수 내부에서 `int* arr`와 동일하게 해석한다. (sizeof() 연산하면, 그냥 포인터 크기만 계산됨.) 이 떄문에 배열의 크기를 같이 함수 매개변수에 넘겨주어야 하는 과정이 생긴다. 또한 반복자(iterator), 대입 연산자 등을 사용할 수 있다. 이 덕분에 에 정의된 함수를 std::array에 사용할 수 있는..
2025.05.03
[C++] Data Types, Type Modifier
Data Types 카테고리종류설명예시 데이터 타입Built-in간단한 값을 저장하는 데 사용되는 기본 데이터 타입. Built-in 또는 primitive 타입이라고 불린다.int, float, double, char, bool, voidDerived Data TypesBuilt-in 타입을 기반으로 더 복잡하게 만들어진 타입이다. 예를 들어, int*, int&, int[10], int()는 모두 int에서 파생된 타입Functions, Arrays, Pointers, ReferenceUser Defined Data Types프로그래머가 필요에 따라 만든 사용자 지정 데이터 타입class, struct, union, typedef, using Data Type Modifiertype modifier..
2025.05.03
no image
[QT] QWidget 기본 개념 정리
QWidget기본 개념QWidget 모든 위젯의 기반 클래스이다. QWidget은 가장 기본적인 Draw와 이벤트 처리 기능만 제공하기에 이를 상속받아 필요한 추가 기능들을 구현해놓은 클래스들이 존재한다. 보편적으로는 데스크톱 프로그램을 제작할 때 메인 프레임은 QWidget을 상속받은 QMainWindow를 기본으로 사용하고, 실제 UI 컨텐츠를 표시하기 위해서 QWidget을 central widget으로 사용한다. 그리고 QDialog는 팝업창처럼 사용되며 이는 수락, 거부 등의 버튼과 잘 작동하도록 하는 기능이 존재한다. 또한 QWidget이 직접적인 기능을 제공 하지 않은 추가적인 예는 QWidget에 글꼴 속성이 존재하지만, 직접 사용하지 않고 QLabel, QPushButton, QTabWi..
2025.05.02
[QT] QApplication
QApplicationQApplication은 signal-slot을 작동시키는 이벤트 루프를 실행한다. 실행중인 이벤트 루프가 없으면 GUI 컴포넌트에서 발생하는 이벤트는 전혀 전파되지 않으므로 UI는 아무일도 하지 않게 된다. 해당 메인 이벤트 루프는 다음과 같은 것들을 처리한다:사용자 데스크톱 설정 초기화 (예: 폰트, 팔레트, 더블 클릭 간격) 이벤트 마우스, 키보드, 새로고침기존 창 시스템에서 이벤트를 수신하여 관련 위젯으로 전송하는 이벤트 처리sendEvent(), postEvent()를 사용하여 자체 이벤트를 위젯에 전달 가능커맨드 라인 매개변수 처리스타일 관리. QStyle 객체에 캡슐화되며 런타임에 setStyle()을 사용하여 변경 가능translate()를 통해 문자열 현지화clipb..
2025.05.02
QT
no image
[QT] CMake로 환경 설정
환경 설정기존에는 QT 설치 경로를 CMAKE_PREFIX_PATH에 설정한 뒤, find_pacakge를 사용했지만 QT6_ROOT라는 변수를 지정하는 방법도 가능하다고 한다,https://cmake.org/cmake/help/latest/variable/PackageName_ROOT.html 이를 살펴보면, find_package() 커맨드는 CMAKE_PREFIX_PATH도 참고하지만, _ROOT CMake 변수에 지정된 prefix도 검색한다. CMake 3.27 버전부터 추가됐다고 한다.크로스 컴파일하거나 vanila cmake를 사용할 때는 QT6_ROOT 또는 CMAKE_PREFIX_PATH 같은 검색 경로 대신 CMAKE_TOOLCHAIN_FILE을 설정 QT 소스 importing모던 C..
2025.04.30
QT
no image
[CMake] ExternalProject_Add() 사용 연습
ExternalProject 모듈ExternalProject_Add()를 사용해서 SPDLOG를 다운받고, 그 과정에서 오류 해결을 하는 과정을 기록한다. 또한 CMake 3.11 이전 버전이라면 ExternalProject 모듈밖에 선택지가 없지만, 그 이후라면 FetchContent 모듈을 사용하는 방법도 존재한다. ExternalProject는 빌드 타임에 외부 파일들을 불러오며, FetchContent는 CMake를 실행하는 시점에 외부 파일들을 불러온다. ExternalProject_Add()공식 문서에서 ExternalProject_Add()의 옵션에 대해 확인할 수 있다. ExternalProject_Add 커맨드는 외부 프로젝트의 download, update, patch, configur..
2025.04.24
[CMake] .cmake 파일의 사용
.cmake 파일의 사용include 커맨드로 .cmake 파일을 include 할 수 있다. .cmake 파일은 함수 정의, 매크로를 포함할 수 있으며 여러 CMakeLists.txt에서 재사용할 수 있다. 사실은 모든 파일을 include 할 수 있지만, 일반적으로 확장자는 .cmake가 사용된다.// CMakeLists.txtcmake_minimum_required(VERSION 3.17)project(cmake-practice)set(CMAKE_CXX_STANDARD 17)add_executable( ${PROJECT_NAME} src/main.cpp)include(dependency.cmake)// dependency.cmakemessage("include dependency.cmake!..
2025.04.23
[OpenGL, SPDLOG] SPDLOG의 'formatting of non-void pointers is disallowed'
SPDLOG의 'formatting of non-void pointers is disallowed'발생한 에러 메시지: error C2338: static_assert failed: 'formatting of non-void pointers is disallowed' 에러 발생 코드SPDLOG_INFO 함수 호출을 통해 glVersion을 출력하는 과정에서 에러가 발생하였다.if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){ SPDLOG_ERROR("failed to initialize glad"); glfwTerminate(); return -1;}auto glVersion = glGetString(GL_VERSION);SPDLOG_I..
2025.04.22
[CMake] target_link_directories(), target_link_libraries()
target_link_directories(), target_link_libraries()타겟을 링킹할 때 링커가 라이브러리를 검색할 경로를 지정한다. 즉, 외부라이브러리의 lib 파일 디렉토리를 지정할 때 사용된다. 각 항목은 절대 경로 또는 상대 경로일 수 있으며, 후자는 현재 소스 디렉토리에 대한 상대 경로로 해석된다. 주의할 점은 `target_link_directories()`만 단독으로 쓰는 것은 권장되지 않는 것 같다. 단독으로 사용하게 되면 링커가 타겟에 필요한 라이브러리를 알아서 찾도록 동작하기에 링크할 대상 파일이 무엇인지 명확하지 않다. 그래서 `target_link_libraries()`와 같이 사용하게 된다. 예시target_link_directories(${PROJECT_NAME..
2025.04.22