이 글에서는 방정식을 활용하여 평면 위의 세 점 a, b, c로 정의된 원을 기준으로, 점 d가 해당 원의 내부에 속하는지 아니면 외부에 속하는지 판별하는 C++ 프로그램을 소개합니다. 판별에 사용되는 핵심 식은 다음과 같습니다. s = (x - xt)^2 + (y - yt)^2 – r*r 여기서 t(xt, yt)는 평면 위의 임의의 점이며, 세 점 (x1, y1), (x2, y2), (x3, y3)으로 결정된 원에 대한 점 t의 상대적 위치를 값 s로 나타냅니다. s < 0 : 점 t는 원의 내부에 있습
이 글에서는 2차원 평면에서 선물 포장 알고리즘(Gift Wrapping Algorithm)을 구현하는 C++ 프로그램을 다룹니다. 선물 포장 알고리즘은 주어진 점(point) 집합의 볼록 껍질(Convex Hull)을 계산하는 대표적인 기하 알고리즘으로, 선물 상자를 포장할 때 끈을 감싸듯이 가장 바깥쪽 점들을 순서대로 찾아가는 방식이라는 의미에서 이런 이름이 붙었습니다.알고리즘 개요선물 포장 알고리즘의 동작 과정은 다음과 같습니다.시작 n개의 점 집합에 대한 볼록 껍질을 구하는 convexHull() 함수 정의:
C++ 네임스페이스와 클래스의 차이점 C++에서 네임스페이스(namespace)와 클래스(class)는 목적과 동작 방식이 완전히 다른 두 가지 개념입니다. 클래스는 데이터 타입(data type)으로, 구조체(structure)의 확장된 형태이며 데이터 멤버와 멤버 함수를 포함할 수 있습니다. 반면 네임스페이스는 변수와 함수를 하나로 묶어 그룹화하는 역할을 수행합니다. 네임스페이스는 객체로 생성할 수 없다는 점도 중요한 특징입니다. 네임스페이스는 이름이 같은 함수, 클래스, 변수 등을 서로 구분하기 위한 추가 정보로 활용되며, 동
C++ 프로그래밍에서 std::vector와 std::array는 모두 여러 개의 요소를 저장하는 대표적인 컨테이너입니다. 하지만 두 컨테이너는 동작 방식, 메모리 관리, 성능 측면에서 중요한 차이점을 가지고 있습니다. 이 글에서는 두 컨테이너의 차이를 자세히 살펴보고, 실제 예제 코드를 통해 그 사용법을 확인해 보겠습니다. std::vector와 std::array의 주요 차이점 벡터(vector)는 요소를 저장하는 순차 컨테이너이며, 인덱스 기반이 아닙니다. 배열(array)은 동일한 타입의 요소들을 고정된 크기로 순차적으로
C++의 배열 클래스(std::array)는 매우 효율적일 뿐만 아니라 자신의 크기까지 스스로 알고 있는 똑똑한 컨테이너입니다. 일반적인 C 스타일 배열과 달리 크기 정보를 함께 관리하므로 더 안전하고 편리하게 사용할 수 있습니다.배열 연산에 사용되는 주요 함수size() : 배열의 크기, 즉 배열에 저장된 요소의 개수를 반환합니다.max_size() : 배열이 담을 수 있는 최대 요소 개수를 반환합니다.get(), at(), operator[] : 배열 요소에 접근할 때 사용합니다.front() : 배열의 첫 번째(앞쪽) 요소를
식 트리(Expression Tree)는 산술 표현식을 나타내기 위해 사용되는 이진 트리입니다. 식 트리에서는 내부 노드가 연산자에 해당하고, 각 리프 노드가 피연산자에 해당합니다. 이 글에서는 접두사(prefix) 형태로 주어진 표현식으로부터 식 트리를 구성한 뒤, 전위(preorder), 중위(inorder), 후위(postorder) 세 가지 순회 결과를 모두 출력하는 C++ 프로그램을 소개합니다. 식 트리 구성 원리 접두사 표현식은 연산자가 피연산자보다 앞에 오는 형태입니다. 따라서 트리를 만들 때는 문자열을 오른쪽 끝에서
이 글에서는 C++에서 반복문(loop), 재귀(recursion), goto를 사용하지 않고 특정 문자를 n번 출력하는 방법을 알아보겠습니다.이 문제는 생각보다 아주 간단하게 해결할 수 있습니다. 바로 string 클래스의 생성자를 활용하는 것입니다. string 클래스에는 두 가지 인자를 받는 생성자가 있는데, 하나는 반복해서 채울 문자(character), 다른 하나는 반복 횟수(count)입니다. 이 생성자를 사용하면 지정한 문자로 가득 찬 문자열을 한 번에 만들 수 있습니다.string 생성자의 동작 원리string(cou
C++에는 int, char, double 등 다양한 데이터 타입이 존재합니다. 이 글에서는 sizeof 연산자를 활용해 각 데이터 타입의 크기를 구하고, 이를 바탕으로 표현 가능한 값의 범위(최솟값과 최댓값)를 프로그래밍 방식으로 계산하는 방법을 살펴보겠습니다.범위 계산 원리sizeof 연산자를 사용하면 데이터 타입의 크기를 바이트(byte) 단위로 얻을 수 있습니다. 여기에 8을 곱하면 비트(bit) 단위 크기로 변환됩니다.비트 수가 n이라고 할 때, 표현 범위는 다음과 같이 결정됩니다.부호 있는(signed) 타입: 최솟값은
std::endl의 숨겨진 비용 C++에서 줄 바꿈을 위해 std::endl을 습관적으로 사용하는 개발자가 많습니다. 소량의 입출력에서는 문제가 되지 않지만, 대량의 데이터 처리 시 심각한 성능 저하를 초래할 수 있습니다. std::endl이 실제로 하는 일 std::endl은 단순히 줄 바꿈 문자(\n)를 출력하는 것이 아닙니다. 내부적으로 다음 두 가지 작업을 순차적으로 수행합니다. 줄 바꿈 문자(\n) 출력 출력 버퍼 강제 플러시(flush() 호출) 버퍼 플러시가 성능에 미치는 영향 버퍼 플러시는 운영체제에 쓰
fork() 시스템 콜은 하나의 프로세스를 두 개의 프로세스로 분리하는 데 사용됩니다. fork() 함수가 0을 반환하면 자식 프로세스이고, 그렇지 않으면 부모 프로세스입니다. 이번 예제에서는 프로세스를 네 번 분할하고, 이를 아래에서 위로(bottom-up), 즉 손자 → 자식 → 부모 순서로 실행하는 방법을 알아보겠습니다. 동작 원리 먼저 fork() 함수를 연속으로 두 번 호출합니다. 첫 번째 fork() 호출로 하나의 자식 프로세스가 생성되고, 두 번째 fork() 호출로 또 다른 자식 프로세스가 생성됩니다. 이후 내부의 f
C++의 reference_wrapper는 참조(reference)를 복사 생성 가능하고 복사 대입 가능한 객체로 감싸주는 클래스 템플릿입니다. 표준 라이브러리의 <functional> 헤더에 정의되어 있으며, 참조 자체는 컨테이너에 저장할 수 없거나 복사 의미론에서 제약이 있기 때문에 이러한 래퍼가 필요합니다.reference_wrapper란 무엇인가?std::reference_wrapper<T>의 인스턴스는 기본적으로 하나의 객체입니다. 하지만 내부적으로 T 타입에 대한 참조를 보관하고 있으며, 필요할 때
이 글에서는 C++를 이용해 중공(hollow) 피라미드와 중공 다이아몬드 패턴을 생성하는 방법을 알아봅니다. 일반적인 꽉 찬(solid) 피라미드 패턴은 비교적 쉽게 만들 수 있지만, 속이 빈 형태로 만들려면 몇 가지 추가적인 기법이 필요합니다.중공 피라미드(Hollow Pyramid)중공 피라미드의 구조는 다음과 같습니다.첫 번째 줄에는 별(*) 하나만 출력합니다.마지막 줄에는 n개의 별을 연속해서 출력합니다.나머지 줄에서는 각 줄의 시작과 끝에 정확히 두 개의 별을 찍고, 그 사이는 공백으로 채워 속이 빈 모양을 만듭니다.예제
개요 이번 글에서는 C++에서 fork() 시스템 콜을 사용하여 자식 프로세스를 생성하는 방법과, 각 프로세스에서 서로 다른 연산을 수행하는 예제를 살펴보겠습니다. 부모 프로세스에서는 배열에 포함된 모든 짝수의 합을 구하고, 자식 프로세스에서는 배열 요소 중 홀수의 합을 계산합니다. fork()의 동작 원리 fork()는 호출 시점의 프로세스를 복제하여 새로운 자식 프로세스를 만드는 POSIX 시스템 콜입니다. Linux/Unix 환경에서 <unistd.h> 헤더에 선언되어 있으며, 호출 이후에는 부모와 자식 두 프로
이 글에서는 C++의 RTTI(런타임 유형 정보, Runtime Type Information)가 무엇인지 자세히 알아보겠습니다. C++에서 RTTI는 프로그램 실행 중에 객체의 데이터 타입에 대한 정보를 제공하는 메커니즘입니다. 다만 이 기능은 클래스에 최소한 하나 이상의 가상 함수(virtual function)가 존재할 때만 사용할 수 있습니다. RTTI를 활용하면 프로그램이 실행되는 도중에도 객체의 실제 타입을 동적으로 판별할 수 있으며, 대표적인 활용 예로 dynamic_cast 연산자와 typeid 연산자가 있습니다.
이번 글에서는 C++의 크로노(chrono) 라이브러리가 무엇인지, 그리고 어떻게 활용할 수 있는지 살펴보겠습니다. 크로노 라이브러리는 날짜와 시간을 처리하기 위한 표준 라이브러리로, C++11부터 정식으로 도입되었습니다.타이머와 클록(clock)은 운영체제나 하드웨어 환경에 따라 해상도와 동작 방식이 서로 다릅니다. 따라서 더 높은 시간 정밀도(precision)가 필요하다면 이 라이브러리를 사용하는 것이 좋습니다.크로노 라이브러리의 핵심 개념크로노 라이브러리는 시간 길이(duration)와 시점(time point)을 분리함으로
C++에서 예외 처리(Exception Handling)는 프로그램 실행 중 발생하는 런타임 오류를 감지하고 대응하기 위한 메커니즘입니다. 예외(Exception)란 프로그램이 실행되는 도중에 발생하여 던져지는(throw) 이벤트를 의미하며, C++의 모든 표준 예외는 std::exception 클래스로부터 파생됩니다. 만약 예외를 적절히 처리하지 않으면 프로그램은 예외 메시지를 출력한 뒤 강제로 종료됩니다. C++ 표준에서는 이러한 예외들을 <exception> 헤더의 클래스 형태로 정의하고 있어, 프로그램 내에서 언
인버전(Inversion)이란 배열을 오름차순으로 정렬하기 위해 필요한 원소 간 교환 횟수를 의미합니다. 배열이 이미 정렬되어 있다면 인버전 개수는 0이 되고, 반대로 배열이 역순(내림차순)으로 정렬되어 있다면 인버전 개수는 최댓값을 가지게 됩니다.예를 들어 배열에서 앞에 있는 원소가 뒤에 있는 원소보다 큰 경우를 하나의 인버전으로 계산하며, 이러한 쌍의 총 개수가 곧 인버전 카운트입니다.이번 글에서는 C++ 프로그램을 작성하여 배열 내 인버전 개수를 계산하는 방법을 알아보겠습니다.알고리즘가장 기본적인 방법은 이중 반복문을 사용하여
이 글에서는 연결 리스트(Linked List)를 이용해 이진 탐색 트리(Binary Search Tree, BST)를 구현하는 C++ 프로그램을 다룹니다. 노드 삽입부터 전위(preorder), 중위(inorder), 후위(postorder) 순회까지 전체 과정을 알고리즘, 예제 코드, 실행 결과 순으로 살펴보겠습니다.이진 탐색 트리란?이진 탐색 트리는 각 노드가 최대 두 개의 자식 노드를 가지며, 다음 규칙을 만족하는 자료구조입니다.왼쪽 서브트리의 모든 값은 부모 노드보다 작다오른쪽 서브트리의 모든 값은 부모 노드보다 크다이러한
B 트리(B-Tree)는 하나의 노드가 둘 이상의 자식을 가질 수 있다는 점에서 이진 탐색 트리(Binary Search Tree)를 일반화한 자료구조입니다. 스스로 균형을 유지하는(self-balancing) 트리 구조로, 정렬된 데이터를 관리하며 로그 시간(logarithmic time) 안에 순차 접근, 탐색, 삽입, 삭제 연산을 수행할 수 있습니다.이 글에서는 C++를 사용하여 차수(order)가 6인 B 트리를 구현하는 방법을 소개합니다.B 트리의 핵심 특징하나의 노드에 여러 개의 키와 여러 개의 자식 포인터를 저장합니다.
이 문서에서는 크기가 같은 두 개의 정렬된 배열에 저장된 요소들의 중앙값(median)을 찾는 C++ 프로그램을 설명합니다. 두 배열의 요소를 모두 합쳤을 때 전체 개수가 짝수이므로, 중앙값은 정렬된 순서상 중간에 위치한 두 값의 평균이 됩니다. 알고리즘 두 배열이 이미 정렬되어 있다는 점을 이용해 병합 정렬(merge sort)의 병합 과정과 유사하게 동작합니다. 두 배열의 시작 인덱스부터 비교하며 작은 값을 순서대로 가져와, 전체 요소의 절반(n+1번째)까지 도달했을 때의 두 값(n1, n2)을 구해 평균을 냅니다. 알고리즘 M