C++ STL에는 std::for_each처럼 유용하게 활용할 수 있는 범용 함수들이 다수 포함되어 있습니다. 그러나 이러한 함수들은 실제로 사용하기가 다소 번거로울 수 있습니다. 특히 적용하려는 함수 객체(functor)가 해당 함수에서 단 한 번만 사용될 경우 더욱 그렇습니다. 단 한 곳에서만 쓰일 함수를 네임스페이스에 일일이 정의하는 것은 매우 비효율적인 작업입니다.이러한 문제에 대한 해결책이 바로 익명 함수(anonymous function)입니다.C++11부터 람다 표현식(lambda expression)이 도입되어 익명
C++ fabs() 함수란?C 및 C++ 표준 라이브러리의 fabs() 함수는 인자로 전달된 부동 소수점 값의 절댓값(absolute value)을 반환하는 함수입니다. 이 함수는 <cmath> 헤더 파일에 선언되어 있으며, 음수는 양수로 변환하고 양수는 그대로 유지한 값을 돌려줍니다.함수 선언fabs() 함수는 다음과 같은 형태로 선언되어 있습니다.double fabs(double x)매개변수x − 절댓값을 구하고자 하는 부동 소수점(floating point) 값입니다.반환값전달된 값 x의 절댓값을 double 타입으
이진 탐색 트리(Binary Search Tree, BST)는 다음 세 가지 핵심 성질을 만족하는 이진 트리 자료구조입니다.노드의 왼쪽 서브트리에는 해당 노드의 키보다 작은 키를 가진 노드만 존재해야 합니다.노드의 오른쪽 서브트리에는 해당 노드의 키보다 큰 키를 가진 노드만 존재해야 합니다.왼쪽과 오른쪽 서브트리 각각도 반드시 이진 탐색 트리여야 합니다.BST 판별 알고리즘가장 널리 사용되는 방법은 각 노드가 가질 수 있는 허용 범위(min, max)를 전달하며 재귀적으로 검증하는 것입니다. 루트부터 시작해 내려갈수록 범위를 점차
C++에서 바인딩(Binding)은 식별자(변수나 함수 이름)를 실제 메모리 주소로 연결하는 과정을 의미합니다. 모든 변수와 함수에 대해 바인딩이 수행되며, 특히 함수의 경우 컴파일러가 함수 호출을 올바른 함수 정의와 매칭시키는 작업을 말합니다. 이 바인딩은 컴파일 시점 또는 런타임 시점에 수행될 수 있으며, 각각 초기 바인딩과 후기 바인딩으로 구분됩니다.초기 바인딩(Early Binding)이란?초기 바인딩은 컴파일 타임 다형성(정적 다형성)이라고도 불립니다. 컴파일러가 컴파일 단계에서 함수 호출에 해당하는 주소를 직접 연결하므로
이진 탐색 트리(Binary Search Tree, BST)는 다음 세 가지 조건을 만족하는 이진 트리 자료구조입니다. 노드의 왼쪽 서브트리에는 그 노드의 키보다 작은 키를 가진 노드만 포함됩니다. 노드의 오른쪽 서브트리에는 그 노드의 키보다 큰 키를 가진 노드만 포함됩니다. 왼쪽 서브트리와 오른쪽 서브트리 역시 각각 이진 탐색 트리의 조건을 만족해야 합니다. 확인 알고리즘 이 문제는 각 노드가 가질 수 있는 값의 허용 범위(최솟값~최댓값)를 전달하면서 트리를 재귀적으로 순회하는 방식으로 해결할 수 있습니다. BSTUtil 함
C++ 표준 라이브러리는 별도의 날짜 타입을 제공하지 않습니다. 대신 C++은 C 언어로부터 날짜와 시간을 다루는 구조체와 함수들을 그대로 물려받아 사용합니다. 따라서 날짜 및 시간 관련 함수와 구조체에 접근하려면 프로그램 상단에 <ctime> 헤더 파일을 포함시켜야 합니다.시간 관련 주요 데이터 타입C++에서 시간과 관련된 대표적인 타입은 네 가지입니다.clock_ttime_tsize_ttm이 중 clock_t, size_t, time_t는 시스템의 시간과 날짜를 일종의 정수 형태로 표현할 수 있습니다.tm 구조체tm
이진 트리(Binary Tree)는 각 노드가 최대 두 개의 자식 노드를 가질 수 있는 트리 형태의 자료구조입니다. 두 자식 노드는 각각 왼쪽 자식(left child)과 오른쪽 자식(right child)으로 구분됩니다.이 글에서는 하나의 이진 트리가 다른 이진 트리 안에 포함되어 있는지, 즉 하위 트리(subtree)인지 판별하는 C++ 프로그램을 알고리즘과 함께 살펴보겠습니다.하위 트리 판별 알고리즘판별 과정은 두 단계로 나뉩니다. 먼저 두 트리가 완전히 동일한지 검사하는 identical() 함수를 정의하고, 이를 활용해 메
멀티스레딩이란?멀티스레딩(Multithreading)은 멀티태스킹의 한 특수 형태입니다. 여기서 멀티태스킹이란 컴퓨터가 두 개 이상의 프로그램을 동시에 실행할 수 있도록 해주는 기능을 의미합니다. 일반적으로 멀티태스킹에는 두 가지 유형이 있습니다. 바로 프로세스 기반(process-based) 방식과 스레드 기반(thread-based) 방식입니다.프로세스 기반 멀티태스킹은 프로그램 전체의 동시 실행을 처리하는 반면, 스레드 기반 멀티태스킹은 동일한 프로그램 내부의 일부 조각들을 동시에 실행하는 것을 다룹니다.멀티스레드 프로그램은
식 트리(Expression Tree)는 수식을 표현하기 위해 사용되는 이진 트리(Binary Tree)입니다. 식 트리에서 내부 노드는 연산자(operator)에 해당하고, 각 리프 노드(leaf node)는 피연산자(operand)에 해당합니다.이 글에서는 C++를 사용하여 후위 표기식(postfix expression)으로부터 식 트리를 구성하고, 이를 중위(inorder), 전위(preorder), 후위(postorder) 순회 방식으로 출력하는 프로그램을 살펴봅니다.알고리즘프로그램의 전체적인 동작 흐름은 다음과 같습니다.시
C/C++ 표준 라이브러리 함수인 exp()는 자연상수 e(약 2.71828)를 x번 거듭제곱한 값, 즉 ex를 반환하는 함수입니다. 수학에서 자주 사용되는 지수 함수를 프로그래밍으로 구현할 때 필수적인 함수로, 과학 계산, 금융 공학, 통계 모델링 등 다양한 분야에서 활용됩니다.함수 선언double exp(double x)매개변수 및 반환값exp() 함수는 하나의 매개변수를 받습니다.매개변수(x): 지수 값으로 사용할 부동소수점(floating point) 숫자입니다.반환값: e를 x번 거듭제곱한 지수 값을 double 형태로 반
개요 이진 트리(Binary Tree)는 각 노드가 최대 두 개의 자식을 가질 수 있는 트리 구조로, 자식은 각각 왼쪽 자식(left child)과 오른쪽 자식(right child)으로 구분됩니다. 이 글에서는 C++를 사용해 이진 트리에서 가장 깊은 위치에 있는 왼쪽 리프(잎) 노드를 찾는 방법을 알아봅니다. 알고리즘 재귀 함수 deepestLLeafutil()을 활용하여 주어진 이진 트리를 순회하면서 가장 깊은 왼쪽 리프를 찾습니다. 함수에서 사용하는 주요 변수는 다음과 같습니다. lvel : 현재 노드의 레벨(깊이) max
C++의 log() 함수란? C/C++ 표준 라이브러리의 double log(double x) 함수는 인자로 전달된 값의 자연로그(natural logarithm), 즉 밑이 e인 로그를 반환합니다. 이 함수를 사용하려면 <cmath> 헤더 파일을 소스 코드에 포함해야 합니다. 함수 선언 double log(double x) 매개변수와 반환값 매개변수: x는 로그를 계산할 부동소수점(floating point) 값입니다. 수학적으로 로그는 양수에 대해서만 정의되므로, x는 반드시 0보다 큰 값이어야 합니다. 반환값:
C++의 memset() 함수란? 이 글에서는 C++에서 memset() 함수가 어떤 역할을 하는지 자세히 알아보겠습니다. memset() 함수는 주어진 문자 값을 unsigned char로 변환한 뒤, str[] 포인터가 가리키는 객체의 처음 n개 문자 각각에 해당 값을 복사합니다. 만약 n이 실제 문자열 크기보다 크다면 프로그램의 동작은 정의되지 않습니다(undefined). memset() 함수 문법 void* memset( void* str, int c, size_t n); str: 값을 채워 넣을 대상 메모리 블록의 포
이진 트리(Binary Tree)는 각 노드가 최대 두 개의 자식 노드를 가질 수 있는 트리 구조로, 왼쪽 자식(left child)과 오른쪽 자식(right child)으로 구분됩니다. 이 글에서는 C++을 사용하여 이진 탐색 트리에서 두 노드의 최소 공통 조상(Lowest Common Ancestor, LCA)을 찾는 방법을 알아보겠습니다.알고리즘 개요이진 탐색 트리의 핵심 성질을 활용하면 LCA를 효율적으로 찾을 수 있습니다. BST에서는 루트를 기준으로 왼쪽 서브트리의 모든 값은 루트보다 작고, 오른쪽 서브트리의 모든 값은
C++에서 벡터(vector)를 요소로 가지는 벡터를 2차원 벡터, 즉 2D 벡터라고 부릅니다. 2D 벡터는 행마다 서로 다른 개수의 요소를 가질 수 있어, 일반적인 2차원 배열보다 유연하게 사용자가 원하는 크기를 지정할 수 있다는 장점이 있습니다.알고리즘시작 2D 벡터 타입의 변수 v를 선언한다. 벡터 v에 값을 초기화한다. the 2D vector is: 를 출력한다. for (int i = 0; i < v.size(); i++) for (int j = 0; j < v[i].
C++ div() 함수란?C/C++ 표준 라이브러리 함수인 div_t div(int numer, int denom)는 분자(numer)를 분모(denom)로 나누는 함수입니다. 이 함수의 가장 큰 장점은 몫(quotient)과 나머지(remainder)를 단 한 번의 연산으로 동시에 얻을 수 있다는 점입니다.함수 선언div_t div(int numer, int denom)매개변수 및 반환값매개변수:numer: 나누어질 수(분자)denom: 나누는 수(분모)반환값: 이 함수는 <cstdlib> 헤더 파일에 정의된 구조체 형
개요 이 글에서는 주어진 이진 트리에서 가장 큰 독립 집합(Largest Independent Set, LIS)의 크기를 구하는 C++ 프로그램을 다룹니다. 여기서 독립 집합이란 트리에서 간선으로 직접 연결된 노드, 즉 부모-자식 관계에 있는 노드를 동시에 선택하지 않는 노드들의 집합을 의미합니다. 알고리즘 정수 데이터 d, 왼쪽 자식 포인터 l, 오른쪽 자식 포인터 r, 그리고 메모이제이션용 lis 필드를 갖는 구조체 n을 선언합니다. 두 정수 중 더 큰 값을 반환하는 max() 함수를 작성합니다. 루트 노드를 입력받아 해당
개요이번 문제는 콘솔에 Hello World를 출력하되, main 함수 내부에는 아무 코드도 작성할 수 없다는 조건을 만족해야 합니다.언뜻 보면 불가능해 보이지만, C++의 전역 변수 초기화와 객체 생성 시점의 특성을 활용하면 두 가지 방법으로 해결할 수 있습니다.방법 1: 전역 변수와 printf() 활용첫 번째 방법은 전역 변수를 선언하고, 그 변수에 printf() 함수의 반환값을 저장하는 것입니다. 전역 변수의 초기화는 main 함수가 실행되기 전에 이루어지므로, 초기화 과정에서 printf()가 호출되면서 자연스럽게 문자열
이 글에서는 한 텍스트 파일의 내용을 다른 텍스트 파일 끝에 추가(append)하는 C++ 프로그램을 소개합니다. C++에서는 <fstream> 헤더가 제공하는 파일 스트림 클래스를 활용하면 파일 입출력 작업을 간단하고 효율적으로 처리할 수 있습니다.입력 예시a.txt 파일의 내용: "Tutorials" a1.txt 파일의 내용: "point"출력 결과Tutorialspoint알고리즘프로그램의 전체적인 동작 흐름은 다음과 같습니다.fstream 클래스 객체를 정의합니다.입력 파일 스트림
C++ 프로그래밍에서는 ofstream과 ios::app 모드를 사용하면 기존 파일의 내용을 지우지 않고 그 뒤에 새로운 텍스트를 손쉽게 추가할 수 있습니다. 이번 글에서는 a1.txt라는 텍스트 파일에 문자열을 추가하는 예제 프로그램을 살펴보겠습니다. 알고리즘 fout 파일 스트림 객체로 a1.txt 파일을 append 모드(ios::app)로 열어 출력 작업을 준비합니다. 파일이 존재하면 해당 파일에 텍스트를 추가합니다. fout 스트림을 닫습니다. a1.txt 파일을 다시 열어 파일의 내용을 읽습니다. 파일에서 텍스트를 추출