개요이 글에서는 두 개의 스택(Stack)을 사용하여 큐(Queue)를 구현하는 C++ 프로그램을 소개합니다. 스택과 큐는 각각 LIFO와 FIFO라는 서로 다른 데이터 처리 순서를 가지기 때문에, 두 개의 스택을 조합하면 큐의 동작 방식을 효율적으로 흉내 낼 수 있습니다.스택(Stack)이란?스택은 LIFO(Last In First Out, 후입선출) 방식으로 동작하는 자료구조입니다. 즉, 삽입과 삭제가 모두 같은 끝(top)에서 이루어지며, 가장 마지막에 들어온 요소가 가장 먼저 삭제됩니다.스택의 주요 연산push(int dat
cout << endl vs cout << \n, 무엇이 다를까?C++에서 콘솔이나 파일에 출력할 때 cout << endl과 cout << \n은 겉보기에 같은 결과를 내지만, 내부 동작에는 중요한 차이가 있습니다. 상황에 따라서는 \n을 사용하고 endl은 피하는 것이 좋습니다.std::endl을 피해야 하는 이유std::endl은 현재 줄 뒤에 새 줄을 만드는 역할을 합니다. 몇 줄 되지 않는 간단한 입출력 작업에서는 문제가 되지 않지만, 대량의 입출력(I/O) 작업이 필요한 경우에는 성능 저하의 원인이 됩니다.핵심은 endl
자료구조 학습에서 자주 등장하는 문제 중 하나는 큐(Queue) 두 개만을 이용해 스택(Stack)을 구현하는 것입니다. 이 글에서는 스택과 큐의 기본 개념을 짚어본 뒤, 연결 리스트 기반의 큐 두 개를 사용해 스택의 LIFO(후입선출) 동작을 재현하는 C++ 프로그램을 단계별로 살펴보겠습니다. 스택(Stack)이란? 스택은 LIFO(Last In, First Out, 후입선출) 방식으로 동작하는 자료구조입니다. 데이터의 삽입과 삭제가 모두 한쪽 끝, 즉 top(꼭대기)에서 이루어지며, 가장 마지막에 들어간 요소가 가장 먼저 삭제
덱(Dequeue, Double Ended Queue)은 큐(Queue) 자료구조를 일반화한 형태로, 양쪽 끝(앞과 뒤)에서 모두 삽입과 삭제가 가능한 자료구조입니다. 일반적인 큐는 한쪽에서만 삽입하고 반대쪽에서만 삭제할 수 있지만, 덱은 이러한 제약이 없어 더욱 유연하게 활용할 수 있습니다. 덱의 기본 연산 덱에서 사용되는 대표적인 기본 연산은 다음과 같습니다. insert_at_beg() : 덱의 앞(front)에 요소를 삽입합니다. insert_at_end() : 덱의 뒤(rear)에 요소를 삽입합니다. delete_fr_b
C/C++ 표준 라이브러리 함수 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)는 지정된 스트림(stream)에서 데이터를 읽어 ptr이 가리키는 메모리 배열에 저장하는 역할을 합니다. 주로 파일에서 구조체나 바이너리 데이터를 한 번에 읽어올 때 유용하게 사용됩니다.fread() 함수 선언size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)매개변수 설명아래 표는 fread() 함수의 각 매개변수와 그 역
큐(Queue)란?큐는 FIFO(First In First Out, 선입선출) 구조로 동작하는 대표적인 선형 자료구조입니다. 새로운 데이터는 한쪽 끝인 후단(rear)에서 삽입되고, 삭제는 반대쪽 끝인 전단(front)에서 이루어집니다. 덕분에 가장 먼저 들어간 데이터가 가장 먼저 나오게 되며, 작업 대기열, 프린터 스풀, 메시지 처리처럼 순서가 중요한 다양한 분야에서 활용됩니다.이번 글에서는 배열(Array)을 기반으로 큐를 직접 구현하는 C++ 프로그램을 단계별로 살펴보겠습니다.큐의 주요 연산EnQueue(int data) –
방향 그래프(directed graph)가 주어졌을 때, 그래프의 모든 정점 쌍 (i, j)에 대해 정점 j가 정점 i에서 도달 가능한지(reachable) 판별해야 하는 경우가 많습니다. 여기서 도달 가능이란 정점 i에서 정점 j로 가는 경로(path)가 존재한다는 뜻입니다. 이러한 도달 가능 여부를 행렬 형태로 나타낸 것이 바로 전이 폐쇄(transitive closure)이며, 워셜 알고리즘(Warshalls Algorithm)은 주어진 그래프 G의 전이 폐쇄를 구하는 데 가장 널리 사용되는 방법입니다. 이번 글에서는 알고리
이 글에서는 C++를 사용해 타원의 넓이를 구하는 방법을 알아보겠습니다. 타원은 여러 구성 요소로 이루어져 있으며, 각 요소가 어떤 역할을 하는지 먼저 살펴본 뒤 실제 코드로 넓이를 계산해 보겠습니다. 구성 요소설명 중심 (Center)타원의 중심점으로, 두 초점을 연결하는 선분의 중간 지점이기도 합니다. 장축 (Major Axis)타원에서 가장 긴 지름입니다. 단축 (Minor Axis)타원에서 가장 짧은 지름입니다. 현 (Chord)타원 둘레 위의 두 점을 잇는 선분입니다. 초점 (Focus)위 그림에 표시된 두 개의
이 글에서 소개하는 프로그램은 최근접 이웃(Nearest Neighbour) 알고리즘을 C++로 구현한 예제입니다. 이 알고리즘은 외판원 문제(Traveling Salesman Problem, TSP)를 해결하는 데 활용되며, 그래프의 모든 노드를 방문하면서 각 간선을 한 번씩만 통과할 때 드는 최소 비용을 계산하는 것이 목표입니다. 필요한 함수와 의사 코드 알고리즘 전체 흐름은 다음 의사 코드와 같습니다. 두 값을 맞바꾸는 swap(), 경로의 총비용을 계산하는 cal_sum(), 가능한 모든 순열을 생성하는 permute() 세
순회 판매원 문제(Traveling Salesman Problem, TSP)는 여러 도시를 각각 한 번씩 모두 방문한 뒤 출발 도시로 되돌아올 때, 총 이동 비용이 최소가 되는 경로를 찾는 고전적인 조합 최적화 문제입니다. 이 글에서는 탐욕(Greedy) 기법 중 하나인 최근접 이웃(Nearest Neighbour) 알고리즘을 이용해 TSP를 구현하는 C++ 프로그램을 살펴봅니다. 최근접 이웃 알고리즘의 동작 원리 최근접 이웃 알고리즘은 이름 그대로 매 단계마다 현재 도시에서 가장 가까운 미방문 도시를 골라 이동하는 방식으로 동작합
C++에서 순수 가상 함수(Pure Virtual Function)란 함수의 구현부(정의)를 작성하지 않고 선언만 존재하는 가상 함수를 말합니다. 선언 시 = 0을 대입하는 방식으로 표시하며, 이는 해당 함수가 파생 클래스에서 반드시 재정의(오버라이딩)되어야 함을 컴파일러에게 알려주는 역할을 합니다. 추상 클래스(Abstract Class)는 이러한 순수 가상 함수를 하나 이상 포함하고 있는 클래스입니다. 추상 클래스는 객체 지향 프로그래밍에서 공통 인터페이스를 정의하는 설계도 역할을 수행합니다. 추상 클래스의 주요 특징 추상 클
C++에서 가상 기본 클래스(virtual base class)는 파생 클래스가 기본 클래스의 복사본을 여러 개 갖게 되는 상황, 즉 흔히 말하는 다이아몬드 상속 문제를 해결하기 위해 사용됩니다.문제 상황: 중복 상속으로 인한 모호성먼저 가상 상속을 사용하지 않은 일반적인 예제를 살펴보겠습니다.#include <iostream> using namespace std; class B { public: int b; }; class D1 : public B { public: int d1; }; class D2
C++ 순수 가상 함수란?순수 가상 함수(pure virtual function)는 C++에서 함수의 정의(구현부) 없이 선언만 하는 가상 함수를 말합니다. 선언할 때 함수 이름 뒤에 = 0을 붙여 표시하는 것이 특징입니다.그렇다면 왜 하필 0을 대입할까요? 사실 여기에는 복잡한 기술적 비밀이 숨어 있지 않습니다. = 0은 실제로 0이라는 값을 함수에 대입하는 연산이 아니라, 이 함수는 순수 가상 함수다라고 컴파일러와 프로그래머에게 알려주는 특수한 문법(syntax)일 뿐입니다. 그 이상의 의미는 없습니다.순수 가상 함수가 필요한
C++ 프로그램에서 순수 가상 소멸자(pure virtual destructor)를 선언하는 것은 아무런 부작용이 없습니다. 오히려 클래스를 추상 클래스로 만들고 싶지만 마땅한 순수 가상 함수가 없을 때 유용하게 활용할 수 있는 방법입니다.순수 가상 소멸자에 함수 본문이 필요한 이유파생 클래스의 소멸자는 기반 클래스의 소멸자보다 먼저 호출됩니다. 따라서 순수 가상으로 선언된 소멸자라 하더라도 반드시 함수 본문(정의)을 제공해야 합니다. 본문을 정의하지 않으면 객체가 소멸되는 과정에서 기반 클래스 소멸자를 호출할 때 실행할 코드가 없
C++와 Java의 가상 함수 기본 동작 차이 C++와 Java는 모두 객체 지향 프로그래밍 언어이지만, 메서드가 기본적으로 가상(virtual)인지 여부에서 정반대의 철학을 보입니다. 이 차이는 다형성(polymorphism)을 활용하는 코드의 실행 결과에 직접적인 영향을 주기 때문에, 두 언어를 함께 다루는 개발자라면 반드시 이해해야 할 핵심 개념입니다. C++: 메서드는 기본적으로 비가상(non-virtual) C++에서 메서드는 기본적으로 비가상(non-virtual)입니다. 따라서 기본 클래스의 포인터나 참조가 파생 클래
개요C++11부터 도입된 가변 함수 템플릿(Variadic Function Templates)은 개수가 정해져 있지 않은 여러 개의 인자를 하나의 함수로 받을 수 있게 해주는 강력한 기능입니다. 서로 다른 타입의 인자도 함께 전달할 수 있어, 타입 안전성을 유지하면서 printf와 같은 유연한 함수를 직접 구현할 때 특히 유용합니다.문법template(typename arg, typename... args) return_type function_name(arg var1, args... var2)여기서 typename... args는
템플릿(template)을 활용해 프로그램 실행 중이 아니라 컴파일 시점(compile time)에 연산을 수행하는 프로그래밍 기법을 템플릿 메타프로그래밍(Template Metaprogramming, TMP)이라고 합니다. 런타임에 처리해야 할 계산을 컴파일러가 코드를 생성하는 단계에서 미리 수행하도록 만드는 방식으로, 실행 속도 향상과 타입 안정성 확보라는 강력한 장점을 제공합니다. 예제 코드 #include <iostream> using namespace std; template<int n> struct
컴퓨터 그래픽스나 계산 기하학(Computational Geometry) 분야에서는 어떤 점이 주어진 직선을 기준으로 어느 쪽에 놓여 있는지 판별해야 하는 경우가 매우 많습니다. 이 글에서는 위-아래 테스트(Above-Below Test)를 적용해 직선에 대한 점의 상대적 위치를 찾는 C++ 프로그램을 단계별로 살펴보겠습니다. 수학적 배경 평면상의 임의의 점 t(xt, yt)가 두 점 m과 n을 지나는 직선 L에 대해 어디에 위치하는지는 다음 스칼라 값을 계산하면 알 수 있습니다. Y = A·xt + B·yt + C 계산 결과에 따
개요이 글에서는 삼각분할(Triangulation) 과정 없이 슬리커(Slicker) 알고리즘을 활용해 다각형의 넓이를 계산하는 C++ 프로그램을 소개합니다. 슬리커 알고리즘은 신발끈 공식(Shoelace Formula)이라고도 불리며, 다각형의 꼭짓점 좌표만 있으면 O(n)의 시간 복잡도로 간단하고 빠르게 넓이를 구할 수 있는 효율적인 기하학 알고리즘입니다.이 알고리즘은 일반적인 수학 관례대로 y축의 양수 방향이 위쪽을 가리킨다고 가정합니다. 반면 컴퓨터 화면 좌표계처럼 y축 양수가 아래쪽인 환경에서는, 해당 좌표계를 기준으로 꼭
다음은 위-아래(above-below) 원시 연산(primitive)을 활용하여 두 직선이 서로 교차하는지 판별하는 C++ 프로그램입니다. 이 기법은 한 직선이 특정 선분과 교차하는지 검사하는 데에도 활용할 수 있습니다. 판별 원리는 간단합니다. 선분의 한 끝점이 직선의 왼쪽에 있고 다른 끝점이 오른쪽에 있는 경우, 그리고 그 경우에만 두 직선은 교차합니다.동작 원리직선의 방정식 ax + by + c = 0에 어떤 점의 좌표를 대입하면, 결과값의 부호에 따라 그 점이 직선의 어느 쪽에 위치하는지 알 수 있습니다. 결과가 양수면 한쪽