개요이 프로그램은 주어진 집합의 모든 부분집합을 사전식 순서(lexicographic order)로 생성하여 출력하는 C++ 코드입니다. 배열에 담긴 원소들로부터 만들 수 있는 각 길이별 조합을 오름차순으로 정렬해 모두 출력하며, 알고리즘의 시간 복잡도는 O(n × 2ⁿ)입니다.n개의 원소를 가진 집합의 부분집합 개수는 공집합을 포함해 총 2ⁿ개입니다. 예를 들어 원소가 6개라면 공집합을 포함해 총 64개의 부분집합이 생성됩니다.알고리즘각 길이 i(1부터 n까지)에 대해 GenAllSubset() 함수를 호출하는 방식으로 동작합니다
그래프 이론에서 정점 커버(Vertex Cover)란 그래프에 존재하는 모든 간선에 대해, 해당 간선이 연결하는 두 정점 M과 N 중 적어도 하나(또는 둘 다)가 반드시 포함되어 있는 정점들의 집합 V를 의미합니다. 즉, 집합 V에 속한 정점들이 그래프의 모든 간선을 덮는(cover) 것입니다.이 글에서는 그래프의 정점 커버를 찾기 위한 휴리스틱(Heuristic) 알고리즘을 C++로 구현하는 방법을 살펴봅니다. 정점 커버 문제는 NP-완전 문제로 알려져 있어 최적해를 다항 시간에 구하기 어렵기 때문에, 실제로는 근사해를 빠르게 찾
이 글에서는 그래프의 간선 색칠(Edge Coloring)을 수행하는 C++ 프로그램을 살펴봅니다. 간선 색칠이란 그래프의 모든 간선에 색을 부여하되, 서로 인접한 두 간선, 즉 같은 정점을 공유하는 간선끼리는 절대 같은 색을 쓰지 않도록 배정하는 기법입니다.간선 색칠의 기본 개념간선 색칠에서 인접한 간선이란 한 정점에서 뻗어 나온 간선들을 의미합니다. 예컨대 정점 A에 연결된 여러 간선은 모두 서로 인접하기 때문에 반드시 서로 다른 색을 가져야 합니다. 그래프 이론의 바이징 정리(Vizings Theorem)에 따르면, 한 정점에
완전 그래프란?완전 그래프(Complete Graph)는 그래프 내 임의의 두 정점 사이에 항상 간선이 존재하는 그래프를 말합니다. 정점이 n개인 완전 그래프는 모든 정점 쌍이 서로 연결되어 있으므로, 간선의 총 개수는 n × (n − 1) / 2가 됩니다.이 글에서는 이러한 완전 그래프에 대해 간선 색칠(Edge Coloring)을 수행하는 C++ 프로그램을 소개합니다. 간선 색칠이란 하나의 정점에 연결된 간선들, 즉 서로 인접한 간선끼리는 서로 다른 색을 갖도록 간선에 색을 배정하는 그래프 이론의 대표적인 문제입니다.알고리즘시작
이번 글에서는 C++에서 short 타입의 리터럴(literal)을 어떻게 다루는지 알아보겠습니다. C와 C++에서는 데이터 타입마다 서로 다른 리터럴 접미사(suffix)를 사용하며, 대표적인 종류는 아래와 같습니다.번호데이터 타입 및 리터럴 예시1int52unsigned int5U3long5L4long long5LL5float5.0f6double5.07char\5표에서 볼 수 있듯이 int, long, float, double 등에는 각각 고유한 리터럴이 존재하지만, short 타입을 위한 전용 리터럴은 없습니다. 즉, shor
C나 C++ 프로그램에서 상수를 정의하는 방법은 크게 세 가지입니다. 바로 #define 매크로, const 키워드, 그리고 열거형(enum)입니다. 이 세 가지는 모두 상수 값을 다루지만 내부 동작 방식과 특성이 서로 다르기 때문에, 어떤 것을 선택해야 할지 혼란스러울 때가 많습니다. 지금부터 각각의 개념과 차이점을 예제와 함께 자세히 살펴보겠습니다. const와 static const const는 변경할 수 없는 상수 타입 데이터를 선언할 때 사용합니다. 컴파일러가 타입 검사를 수행하므로 타입 안정성이 보장되며, 한 번 초기화
C 전처리기(Preprocessor)는 컴파일러의 일부가 아니라, 컴파일 과정에서 별도의 단계로 수행되는 도구입니다. 쉽게 말해 C 전처리기는 단순한 텍스트 치환 도구로서, 실제 컴파일이 시작되기 전에 필요한 사전 처리 작업을 컴파일러에 지시하는 역할을 합니다. 이 문서에서는 편의상 C 전처리기를 CPP라고 부르겠습니다.전처리기 지시문의 기본 규칙모든 전처리기 명령어는 해시 기호(#)로 시작합니다. #은 반드시 해당 줄에서 공백이 아닌 첫 번째 문자여야 하며, 가독성을 위해 전처리기 지시문은 가능하면 줄의 맨 앞 열에서 시작하는 것
C++에서는 구조체(structure)의 멤버 변수를 기준으로 데이터를 손쉽게 정렬할 수 있습니다. 이번 글에서는 book이라는 구조체를 예로 들어, 책의 가격(price)을 기준으로 배열을 오름차순으로 정렬하는 방법을 알아보겠습니다.예제에서 사용할 book 구조체는 책 제목(title), 페이지 수(pages), 가격(price) 세 가지 멤버 변수를 가집니다.비교 함수(Comparator) 작성하기구조체 두 개를 비교하려면 비교 전용 함수를 직접 정의해야 합니다. 이 함수는 두 구조체를 인자로 받아 원하는 기준에 따라 true
형 변환(Type Casting)이란?형 변환(Type Casting)은 변수를 한 데이터 타입에서 다른 데이터 타입으로 변환하는 방법입니다. 예를 들어, long 값을 일반 int 변수에 저장하고 싶다면 long을 int로 형 변환하면 됩니다.C/C++에서는 캐스트 연산자(cast operator)를 사용해 값을 명시적으로 다른 타입으로 변환할 수 있으며, 기본 문법은 다음과 같습니다.(type_name) expression캐스트 연산자 예제다음 예제는 캐스트 연산자를 사용해 정수 나눗셈을 부동소수점 연산으로 수행하는 경우입니다.
C나 C++ 프로그래밍에서 반복문은 코드를 여러 번 실행해야 할 때 필수적인 도구입니다. 그중 가장 많이 사용되는 while 루프와 do…while 루프는 비슷해 보이지만 동작 방식에 중요한 차이가 있습니다. 이 글에서는 두 루프의 기본 개념과 핵심 차이점을 예제 코드와 함께 살펴보겠습니다.while 루프란?while 루프는 주어진 조건이 참(true)인 동안 대상 문장을 계속해서 반복 실행하는 구조입니다. 조건 검사가 루프 본문 실행 이전에 이루어지기 때문에, 처음부터 조건이 거짓이라면 본문은 한 번도 실행되지 않을 수 있습니다.
요즘 배포되는 컴파일러는 대부분 기본적으로 64비트 버전으로 제공됩니다. 하지만 때로는 작성한 코드를 32비트 시스템에서 컴파일하고 실행해야 하는 경우가 있습니다. 이럴 때 GCC가 제공하는 -m32 옵션을 활용하면 됩니다.1. 현재 GCC의 타깃 아키텍처 확인하기먼저 현재 사용 중인 GCC 컴파일러의 타깃 버전이 무엇인지 확인해야 합니다. 터미널에서 다음 명령어를 입력합니다.gcc –vUsing built-in specs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-
C와 C++은 문법적으로 매우 비슷해 보이지만, 문자 리터럴(character literal)을 다루는 방식에는 중요한 차이가 있습니다. 핵심은 바로 문자 상수의 자료형(type)입니다. C++에서 문자 상수의 자료형은 char입니다. 반면 C에서는 문자 상수가 int(정수형)로 취급됩니다. 그 결과, 32비트 아키텍처 환경의 C에서는 sizeof(a)가 4를 반환하며, CHAR_BIT는 8입니다. 흥미롭게도 sizeof(char)는 C와 C++ 모두에서 1바이트로 동일합니다. C 코드 예제 #include<stdio.h&
이 글에서는 C 언어의 구조체와 C++의 구조체 사이의 차이점을 살펴보겠습니다. C++의 구조체는 기본적으로 C++의 클래스와 매우 유사하게 동작합니다. C 구조체에서는 모든 멤버가 기본적으로 public으로 선언되지만, C++ 구조체에서는 기본적으로 private으로 설정됩니다. 그 외의 주요 차이점들을 아래에서 자세히 확인해 보세요.C 구조체 vs C++ 구조체 핵심 차이점C 구조체C++ 구조체구조체 내부에 멤버 함수를 가질 수 없습니다.멤버 변수와 함께 멤버 함수를 포함할 수 있습니다.구조체 데이터를 직접 초기화할 수 없습니다
C++과 Java에는 foreach 루프라고 불리는 또 다른 종류의 반복문이 존재합니다. Foreach 루프는 기존 for 루프를 변형한 형태로, 주로 컨테이너(container)에 저장된 데이터에 접근할 때 사용됩니다.일반적인 for 루프처럼 인덱스 변수를 초기화하거나 조건식을 매번 검사할 필요가 없기 때문에, 배열이나 컬렉션의 요소를 훨씬 간결하고 빠르게 순회할 수 있습니다. 즉, foreach 루프는 어떤 동작을 n번 반복하는 것이 아니라, 컨테이너의 각 요소마다 동작을 수행하는 데 특화된 반복문입니다.참고로 C++에서는 C+
C 표준 라이브러리에는 시간과 관련된 다양한 함수들이 포함되어 있으며, 그중 difftime()은 두 시간 값 사이의 차이를 계산하는 데 사용되는 함수입니다. 이번 글에서는 difftime()의 기본 개념, 사용 방법, 그리고 실제 동작 예제까지 자세히 살펴보겠습니다.difftime() 함수란?difftime() 함수는 두 개의 time_t 타입 시간 값을 인자로 받아, 두 시점 사이의 경과 시간을 초 단위로 반환합니다.함수의 원형은 다음과 같습니다.double difftime(time_t end, time_t beginning);
신호(Signal)는 운영체제가 프로세스에 전달하는 일종의 인터럽트(interrupt)로, 프로그램을 비정상적으로 종료시킬 수 있습니다. UNIX, LINUX, Mac OS X 또는 Windows 환경에서 Ctrl+C를 누르면 이러한 인터럽트를 직접 발생시킬 수 있습니다.모든 신호가 프로그램에서 잡아낼(catch) 수 있는 것은 아니지만, 아래 표에 정리된 신호들은 프로그램 내에서 감지하여 상황에 맞는 적절한 조치를 취할 수 있습니다. 이러한 신호들은 C++의 <csignal> 헤더 파일에 정의되어 있습니다.주요 신호 종
알고리즘 문제를 풀거나 프로그램을 작성하다 보면 특정 데이터 타입이 표현할 수 있는 최솟값 또는 최댓값을 직접 사용해야 하는 경우가 종종 있습니다. 하지만 이렇게 큰 숫자들을 일일이 암기하는 것은 매우 어렵습니다. 이를 위해 C++에서는 각 데이터 타입의 최소·최대 범위를 나타내는 매크로를 제공하고 있습니다. 다만 부호 없는(unsigned) 타입은 최솟값이 항상 0이므로 별도의 최솟값 매크로가 존재하지 않습니다.C++ 데이터 타입별 범위 및 매크로데이터 타입범위최솟값 매크로최댓값 매크로char-128 ~ +127CHAR_MINCH
C++ STL에서 제공하는 set은 데이터를 항상 정렬된 상태로 유지하며, 중복 요소를 허용하지 않는 특수한 연관 컨테이너입니다. 기본적으로 int, double 같은 기본 자료형은 별도 설정 없이 바로 사용할 수 있지만, 직접 만든 클래스나 구조체 같은 사용자 정의 데이터 타입을 저장하려면 추가 작업이 필요합니다.사용자 정의 타입에 필요한 조건: operator< 오버로딩set은 내부적으로 요소들을 정렬하기 위해 비교 연산을 수행합니다. 따라서 사용자 정의 타입을 set에 넣으려면 해당 클래스에 operator<(보다
이번 글에서는 C++의 생성자 위임(Constructor Delegation)에 대해 알아보겠습니다. 생성자 위임이란 한 클래스의 생성자가 같은 클래스의 다른 생성자를 호출하는 기능을 말하며, C++11부터 도입된 특징입니다.먼저 다음 예제 코드를 살펴보고, 이 코드에서 어떤 문제점이 있는지 분석해 보겠습니다.문제가 있는 코드 예제#include <iostream> using namespace std; class MyClass { int a, b, c; public: MyClass(){
이 글에서는 C++에서 fmax()와 fmin() 함수를 사용하는 방법에 대해 자세히 알아보겠습니다.fmax()와 fmin() 함수란?fmax()와 fmin()은 cmath 헤더 파일에 정의되어 있는 수학 함수입니다. 두 함수 모두 float, double, long double 타입의 값 두 개를 인자로 받으며, fmax()는 두 값 중 최댓값을, fmin()은 최솟값을 반환합니다.타입이 다른 인자 처리흥미로운 점은 인자의 타입이 서로 다를 때의 동작입니다. 예를 들어 float와 double을 비교하거나, long double과