이 글에서는 C++에서 정수(int)를 문자열(string)로 변환하는 방법을 알아봅니다.변환 로직은 매우 간단합니다. 핵심은 sprintf() 함수입니다. 이 함수는 값을 콘솔 화면이 아닌 문자열 버퍼에 출력(저장)한다는 점만 printf()와 다릅니다. 첫 번째 인자는 변환된 데이터를 저장할 문자열 버퍼가 됩니다.입력 및 출력 형식입력: 사용자가 숫자 값 입력 (예: 42) 출력: 해당 숫자의 문자열 표현 반환 (예: 42)알고리즘사용자로부터 숫자를 입력받습니다.결과를 저장할 빈 문자열 버퍼를 생성합니다.sprintf() 함수를
삼항 트리(Ternary Tree)란? 삼항 트리는 각 노드가 최대 세 개의 자식 노드를 가질 수 있는 트리 자료구조입니다. 세 개의 자식 노드는 일반적으로 왼쪽(left), 중앙(mid), 오른쪽(right)으로 표현됩니다. 이 트리에서 자식 노드를 가진 노드는 부모 노드가 되며, 자식 노드는 필요에 따라 부모 노드에 대한 참조를 가질 수 있습니다. 삼항 트리는 특히 문자열 집합을 저장하고 빠르게 검색하는 데 유용하며, 이런 용도로 사용될 때는 삼항 검색 트리(Ternary Search Tree)라고도 불립니다. 이번 글에서는 C
이진 탐색 트리(Binary Search Tree)란?이진 탐색 트리는 모든 노드가 다음 두 가지 성질을 만족하는 정렬된 이진 트리입니다.노드의 오른쪽 서브트리에 있는 키는 항상 부모 노드의 키보다 크다.노드의 왼쪽 서브트리에 있는 키는 부모 노드의 키보다 작거나 같다.각 노드는 최대 두 개의 자식 노드만 가질 수 있다.이러한 구조 덕분에 탐색·삽입·삭제 연산을 평균적으로 O(log n) 시간 복잡도로 빠르게 처리할 수 있습니다. 이 글에서는 C++를 활용해 사전(Dictionary) 자료구조에서 데이터를 삽입하고, 검색하고, 삭제
이진 트리를 중위 순회(Inorder Traversal)하면 왼쪽 서브트리를 먼저 방문하고, 그다음 루트 노드, 마지막으로 오른쪽 서브트리를 방문합니다. 이 순서로 탐색하면 키 값이 오름차순으로 출력되는 특징이 있습니다.일반적으로 중위 순회는 재귀 함수로 간단하게 구현할 수 있지만, 이번 글에서는 스택(Stack) 자료구조를 활용하여 재귀 호출 없이 반복문만으로 중위 순회를 수행하는 C++ 프로그램을 살펴보겠습니다. 재귀를 사용하지 않으면 함수 호출 오버헤드가 줄어들고, 깊이가 매우 큰 트리에서 스택 오버플로우 위험도 낮출 수 있습
이진 탐색 트리(Binary Search Tree)란?이진 탐색 트리(BST)는 정렬된 이진 트리로, 모든 노드는 다음 두 가지 성질을 만족해야 합니다.노드의 오른쪽 서브트리에는 부모 노드의 키보다 큰 값들만 존재합니다.노드의 왼쪽 서브트리에는 부모 노드의 키보다 작은 값들만 존재하며, 각 노드는 자식을 최대 두 개까지만 가질 수 있습니다.이러한 구조 덕분에 탐색, 삽입, 삭제 연산을 평균 O(log n) 시간에 수행할 수 있습니다.트리 회전(Tree Rotation)이란?트리 회전은 트리 내 요소들의 순서(정렬 속성)를 해치지 않
이진 트리를 후위 순회(post-order)하면 가장 먼저 왼쪽 서브트리를 방문하고, 그다음 오른쪽 서브트리를 방문한 뒤 마지막에 루트(root)를 방문합니다. 이 글에서는 재귀 호출 없이 스택(stack) 자료구조만을 사용해 이진 트리를 후위 순회하는 C++ 프로그램을 소개합니다.후위 순회의 동작 원리후위 순회는 노드의 값을 처리하는 시점이 왼쪽과 오른쪽 자식 노드를 모두 방문한 후라는 점이 특징입니다. 재귀 함수를 사용하지 않고 구현하려면, 각 노드가 몇 번째로 스택에서 처리되는지를 추적할 수 있는 별도의 플래그 변수(v)를 두
이진 탐색 트리(Binary Search Tree, BST)는 모든 노드가 다음 조건을 만족하는 정렬된 이진 트리입니다.노드의 오른쪽 서브트리에 있는 키는 항상 부모 노드의 키보다 큽니다.노드의 왼쪽 서브트리에 있는 키는 부모 노드의 키보다 작거나 같습니다.각 노드는 최대 두 개의 자식 노드만 가질 수 있습니다.트리 회전(Tree Rotation)이란?트리 회전은 이진 트리에서 요소들의 순서(정렬 속성)를 그대로 유지하면서 트리의 구조만 변경하는 연산입니다. 회전이 일어나면 한 노드는 위로 올라가고 다른 노드는 아래로 내려갑니다.회
문제 상황C++에서 형식화된 추출 연산자(>>)를 사용한 후 std::getline()을 호출하면 입력이 건너뛰어지는 현상이 발생할 수 있습니다. 다음 코드를 통해 이 문제를 간단히 확인해 보겠습니다.예제 코드#include <iostream> #include <string> using namespace std; int main(){ string name; string city; if (cin >> name && getline(cin, city)){
C++에서 큰따옴표()는 문자열 리터럴을 나타내는 데 사용되고, 작은따옴표()는 단일 문자 리터럴을 나타내는 데 사용됩니다. 그렇다면 작은따옴표 안에 여러 개의 문자를 넣어 출력하려고 하면 어떤 결과가 나올까요?예제 코드#include<iostream> using namespace std; main() { cout << 'ABCD'; }실행 결과1094861636프로그램을 실행하면 의외로 매우 큰 숫자가 출력됩니다. 과연 이 숫자에는 어떤 의미가 숨겨져 있을까요?결론부터 말하면, 이 숫자는
C++에서는 함수에 인자를 전달하는 방법이 여러 가지 있습니다. 대표적인 방식은 다음과 같습니다.값에 의한 호출(Call by Value)참조에 의한 호출(Call by Reference)주소에 의한 호출(Call by Address)주소에 의한 호출을 참조에 의한 호출이라고 부르기도 하지만, C++에서 이 둘은 서로 다른 개념입니다. 주소에 의한 호출은 포인터 변수를 사용해 변수의 실제 메모리 주소를 전달하는 반면, 참조에 의한 호출은 참조 변수(원본 변수의 별칭, alias)를 전달합니다. C 언어에는 참조 변수라는 기능이 없기
C++를 활용하면 이진 트리(binary tree)를 순회하면서 홀수 번째 레벨(1, 3, 5번째 레벨)에 위치한 노드들만 골라 출력할 수 있습니다. 이 글에서는 재귀 호출로 트리의 높이를 계산하고, 각 레벨별로 노드를 방문하는 방식으로 이 문제를 해결하는 프로그램을 소개합니다.알고리즘프로그램의 전체적인 흐름을 의사코드(pseudocode)로 정리하면 다음과 같습니다.시작 nod 구조체를 선언한다. 정수형 변수 d를 선언한다. struct nod를 가리키는 포인터 l을 선언한다. s
C++에서 입력 오류 발생 시 cin 상태 문제C++에서 cin은 사용자로부터 입력을 받을 때 사용하는 표준 입력 스트림입니다. 그런데 프로그램 실행 중 다양한 이유로 인해 cin 내부에 오류 플래그(error flag)가 설정되는 경우가 있습니다.예를 들어, 숫자를 입력받아야 하는데 문자가 입력되면 failbit 같은 오류 플래그가 설정됩니다. 오류 플래그가 설정된 상태의 cin은 더 이상 어떤 입력도 정상적으로 받지 못하거나, 입력 버퍼에 남아 있는 잘못된 문자들을 그대로 읽어버리는 문제가 발생합니다.cin.clear()의 역할
C/C++에서 중괄호 생략이 나쁜 습관으로 여겨지는 이유C/C++에서는 if-else 문이나 반복문(for, while 등) 뒤에 오는 중괄호({})를 생략할 수 있습니다. 하지만 중괄호를 생략하면 해당 블록에는 조건문 또는 반복문 바로 다음의 한 문장만 포함된다는 점에 유의해야 합니다. 예를 들어 살펴보겠습니다.if(condition) { Line 1 Line 2 } if(condition) Line 1 Line 2첫 번째 경우에는 Line 1과 Line 2가 모두 if 블록에 속합니다. 그러나 두 번째 경우에는
static_cast란 무엇인가?(int)x는 전통적인 C 스타일 타입 캐스팅이고, static_cast<int>(x)는 C++에서 제공하는 타입 변환 연산자입니다. static_cast<>는 컴파일 시점에 타입 검사를 수행하여 오류를 조기에 잡아낼 수 있는 반면, C 스타일 캐스팅은 이러한 검사 기능을 전혀 지원하지 않습니다. 또한 코드 내에서 static_cast<>는 한눈에 식별되기 때문에 개발자의 의도가 훨씬 명확하게 전달됩니다.C 스타일 캐스팅의 위험성C 스타일 캐스팅에서는 호환되지 않는 타
C와 C++의 따옴표 규칙C와 C++에서 작은따옴표( )는 단일 문자를 표현하는 데 사용되고, 큰따옴표( )는 문자열 리터럴을 표현하는 데 사용됩니다. 겉보기에는 비슷해 보이지만, 내부적으로 처리되는 방식은 완전히 다릅니다.문자열 리터럴 x의 구조문자열 리터럴 x는 단순히 하나의 문자가 아니라 하나의 문자열입니다. 이 문자열은 문자 x와 함께 문자열의 끝을 알리는 널 종료자(null terminator) \0을 포함합니다.따라서 x는 실제로는 두 개의 요소를 가진 문자 배열(character array)입니다. 즉, {x, \0}
C와 C++에서 포인터는 메모리를 직접 다루는 강력한 도구이지만, 잘못 사용하면 심각한 버그의 원인이 됩니다. 이 글에서는 댕글링 포인터(Dangling Pointer), 보이드 포인터(Void Pointer), 널 포인터(Null Pointer), 와일드 포인터(Wild Pointer)의 개념과 발생 원인, 그리고 실제 코드 예제를 통해 안전한 포인터 사용법을 알아봅니다. 1. 댕글링 포인터(Dangling Pointer)란? 댕글링 포인터란 이미 해제되었거나 삭제된 메모리 위치를 가리키는 포인터를 말합니다. 해당 메모리에는 더
C++에서는 함수에 인수를 전달하는 여러 가지 방법이 있습니다. 대표적인 방식은 다음과 같습니다.값에 의한 호출(Call by Value)참조에 의한 호출(Call by Reference)주소에 의한 호출(Call by Address)때때로 주소에 의한 호출이 참조에 의한 호출과 같은 개념으로 알려져 있지만, C++에서는 두 방식이 서로 다릅니다. 주소에 의한 호출에서는 포인터 변수를 사용해 변수의 실제 메모리 주소를 전달하지만, 참조에 의한 호출에서는 해당 변수의 별칭(alias)인 참조 변수를 전달합니다. 이러한 참조 기능은 C
C++ 인터페이스란 무엇인가? 인터페이스(interface)는 C++ 클래스가 제공할 동작이나 기능을 정의하면서도, 그 구체적인 구현 방식에는 얽매이지 않도록 하는 역할을 합니다. 즉, 무엇을 할 수 있는가만 약속하고 어떻게 할 것인가는 구현체에 맡기는 설계 도구입니다. C++에서는 추상 클래스(abstract class)를 사용해 인터페이스를 구현합니다. 단, 여기서 말하는 추상 클래스는 구현 세부 사항과 데이터를 분리하는 개념인 데이터 추상화(data abstraction)와는 다른 개념이므로 혼동하지 않아야 합니다. 순수 가
개요C++에서 포인터를 다루다 보면 *ptr++, *++ptr, ++*ptr처럼 비슷해 보이지만 전혀 다른 의미를 가진 표현식들을 만나게 됩니다. 이 세 표현식의 차이는 연산자 우선순위(precedence)에 의해 결정되는데, 이를 제대로 이해하지 못하면 예상치 못한 버그를 만들 수 있습니다.연산자 우선순위 이해하기핵심은 증감 연산자(++/--)와 역참조 연산자(*) 사이의 우선순위 관계입니다.후위 증감 연산자(ptr++): 전위 증감과 역참조 연산자(*)보다 우선순위가 높습니다.전위 증감 연산자(++ptr): 역참조 연산자(*)보
C++에서 포인터는 메모리를 직접 다룰 수 있게 해주는 강력한 도구이지만, 잘못 사용하면 심각한 오류를 일으킬 수 있습니다. 이 글에서는 댕글링 포인터(Dangling Pointer), void 포인터(Void Pointer), NULL 포인터(Null Pointer), 와일드 포인터(Wild Pointer) 네 가지 주요 포인터 유형을 개념과 예제 코드와 함께 살펴봅니다. 1. 댕글링 포인터(Dangling Pointer) 댕글링 포인터란 이미 해제되었거나 삭제된 메모리 위치를 가리키는 포인터를 말합니다. 유효하지 않은 메모리에