Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++

  1. C++로 B+ 트리(B+ Tree) 구현하기: 알고리즘부터 예제 코드까지

    B+ 트리란 무엇인가? B+ 트리는 이진 탐색 트리(Binary Search Tree)를 일반화한 자료구조로, 하나의 노드가 두 개 이상의 자식을 가질 수 있습니다. 스스로 균형을 유지하는(self-balancing) 트리 구조이기 때문에 정렬된 데이터를 안정적으로 관리하며, 순차 접근·검색·삽입·삭제 연산을 모두 로그 시간(logarithmic time)에 처리할 수 있습니다. B+ 트리는 각 노드가 키(key)만을 담는 B-트리로 볼 수 있으며, 최하위 레벨에 링크로 연결된 리프(linked leaves) 계층이 추가된 형태입

  2. C++로 데카르트 트리(Cartesian Tree) 구현하기

    이 글에서는 C++을 사용하여 데카르트 트리(Cartesian Tree)를 구현하는 방법을 단계별로 살펴봅니다. 데카르트 트리는 각 노드가 배열의 한 원소에 대응하며, 최소 힙 속성(부모 노드가 자식 노드보다 작은 값)과 중위 순회 시 원래 배열 순서가 그대로 유지된다는 두 가지 특징을 동시에 만족하는 이진 트리입니다.데카르트 트리의 핵심 개념데카르트 트리가 되려면 다음 두 조건을 만족해야 합니다.힙 속성: 모든 부모 노드의 값은 자식 노드의 값보다 작습니다(최소 힙 기준).순서 속성: 트리를 중위 순회(inorder travers

  3. C++로 구현하는 이진 트리 이중 순회(Double Order Traversal) 프로그램

    이 글에서는 이진 트리의 이중 순회(Double Order Traversal)를 구현하는 C++ 프로그램을 소개합니다.이중 순회는 일반적인 전위·중위·후위 순회와 달리, 각 서브트리의 루트(부모) 노드를 두 번 방문하는 순회 방식입니다. 노드에 처음 도착할 때 한 번 방문하고, 왼쪽 서브트리를 모두 순회한 뒤 되돌아올 때 한 번 더 방문하는 것이 특징입니다.알고리즘시작 BST 클래스는 다음 함수들을 가진다: insert() = 트리에 항목을 삽입한다. 루트 노드를 먼저 설정한다.

  4. 배열 분할(Partition) 기법으로 k번째로 작은 요소를 찾는 C++ 프로그램

    이 글에서는 배열 분할(Partitioning) 기법을 활용하여 배열에서 k번째로 작은 요소를 찾는 C++ 프로그램을 작성하는 방법을 살펴보겠습니다. 이 방식은 퀵 정렬(Quick Sort)의 분할 과정을 응용한 것으로, 배열 전체를 정렬하지 않고도 원하는 순위의 요소를 효율적으로 찾아낼 수 있다는 장점이 있습니다.동작 원리분할 기법의 핵심 아이디어는 다음과 같습니다. 먼저 배열의 마지막 요소를 피벗(pivot)으로 선택하고, 피벗보다 작은 값을 가진 요소들을 모두 왼쪽으로 이동시킵니다. 분할이 완료되면 피벗은 자신이 있어야 할 최

  5. 이진 검색으로 정렬된 두 배열의 중앙값 구하기 — C++ 프로그램 완벽 가이드

    정렬된 두 배열이 주어졌을 때, 두 배열을 합친 전체 데이터의 중앙값(median)을 효율적으로 구하는 방법 중 하나가 이진 검색(Binary Search) 접근 방식입니다. 이 글에서는 C++로 해당 알고리즘을 직접 구현하는 과정을 단계별로 살펴보겠습니다.핵심 아이디어두 배열이 각각 정렬되어 있다는 특성을 활용하면, 각 배열의 개별 중앙값을 비교하는 것만으로도 전체 중앙값의 위치를 좁혀나갈 수 있습니다. 병합 정렬처럼 실제로 배열을 합치는 O(n+m) 방식과 달리, 이진 검색 기법은 탐색 범위를 절반씩 줄여 나가므로 O(log n

  6. C++로 O(n²) 시간 복잡도의 최대 부분 배열 합 구하기 (브루트 포스 방식)

    이 글에서는 C++를 사용하여 O(n²) 시간 복잡도로 최대 부분 배열 합(maximum subarray sum)을 찾는 프로그램을 다룹니다. 이 방법은 모든 경우를 직접 확인하는 순진한(naive) 방식, 즉 브루트 포스 기법에 해당합니다.알고리즘 개요핵심 아이디어는 길이가 1부터 n까지인 모든 부분 배열을 검사하면서, 각 단계에서 이전 계산 결과를 재활용해 합을 효율적으로 갱신하는 것입니다.시작 배열의 원소들을 입력받는다. 부분 배열의 길이를 1부터 n까지 반복하는 루프를 만든다. 그 안에 중첩된 루프를 만

  7. C++로 구현하는 원형 이중 연결 리스트(Circular Doubly Linked List) 완벽 가이드

    자료구조에서 연결 리스트(Linked List)는 데이터 요소들의 선형 집합입니다. 리스트의 각 요소 즉 노드(node)는 두 가지 항목으로 구성되는데, 하나는 실제 저장되는 데이터이고 다른 하나는 다음 노드를 가리키는 참조(포인터)입니다. 마지막 노드는 null을 참조하며, 연결 리스트에서 진입점(entry point)은 리스트의 헤드(head)라고 합니다.원형 이중 연결 리스트(Circular Doubly Linked List)는 인접한 두 요소가 prev 포인터와 next 포인터로 서로 연결되는 자료구조입니다. 특히 마지막 노

  8. 정렬된 순환 이중 연결 리스트(Sorted Circular Doubly Linked List) 구현하기: C++ 완전 예제

    순환 이중 연결 리스트란?자료구조에서 연결 리스트(Linked List)는 데이터 요소들이 선형으로 연결된 집합입니다. 리스트의 각 요소, 즉 노드(node)는 두 부분으로 구성됩니다. 하나는 실제 저장되는 데이터이고, 다른 하나는 다음 노드를 가리키는 참조(포인터)입니다. 마지막 노드는 null을 참조하며, 연결 리스트의 진입점(entry point)을 헤드(head)라고 부릅니다.순환 이중 연결 리스트(Circular Doubly Linked List)에서는 인접한 두 요소가 이전(prev) 포인터와 다음(next) 포인터로 양

  9. C++로 정렬된 순환 단일 연결 리스트(Sorted Circular Singly Linked List) 구현하기

    자료구조에서 연결 리스트(Linked List)는 데이터 요소들의 선형 집합입니다. 리스트의 각 요소, 즉 노드(node)는 두 가지 항목으로 구성됩니다. 바로 데이터와 다음 노드를 가리키는 참조(포인터)입니다. 마지막 노드는 null을 참조하며, 연결 리스트의 진입점은 헤드(head)라고 부릅니다.단일 연결 리스트(singly linked list)에서 각 노드는 자신의 데이터와 함께 다음 노드를 가리키는 포인터만 저장합니다. 즉, 이전 노드를 가리키는 포인터나 참조는 존재하지 않습니다.순환 연결 리스트(circular linke

  10. C++로 구현하는 정렬된 이중 연결 리스트 완벽 가이드

    자료구조에서 연결 리스트(Linked List)는 데이터 요소들을 선형으로 모아 놓은 집합입니다. 리스트의 각 요소, 즉 노드(node)는 두 가지 항목으로 구성됩니다. 하나는 실제 데이터이고, 다른 하나는 다음 노드를 가리키는 참조(포인터)입니다. 마지막 노드의 참조값은 null이며, 연결 리스트의 진입점을 리스트의 헤드(head)라고 부릅니다. 이중 연결 리스트(Doubly Linked List)는 노드라고 불리는 레코드들이 순차적으로 연결된 구조로 이루어져 있습니다. 각 노드는 세 개의 필드를 포함합니다. 하나의 데이터 필드

  11. C++로 정렬된 단일 연결 리스트(Singly Linked List) 구현하기

    자료구조에서 연결 리스트(Linked List)는 데이터 요소들을 선형으로 모아 놓은 집합입니다. 리스트의 각 요소, 즉 노드(node)는 두 가지 항목으로 구성됩니다. 하나는 실제 데이터이고, 다른 하나는 다음 노드를 가리키는 참조(reference)입니다. 마지막 노드의 참조는 null을 가리키며, 연결 리스트의 진입점(entry point)을 리스트의 헤드(head)라고 부릅니다.단일 연결 리스트(singly linked list)에서 각 노드는 자신이 담고 있는 내용과 함께 리스트상 다음 노드를 가리키는 포인터 또는 참조를

  12. C++ 가상 함수와 런타임 다형성 완벽 정리

    C++에서 가상 함수(virtual function)는 기본 클래스 포인터 목록을 만들어, 실제 파생 클래스 객체의 타입을 몰라도 해당 객체의 메서드를 호출할 수 있도록 해주는 강력한 기능입니다. 가상 함수는 컴파일 시점이 아닌 런타임에 늦은 바인딩(late binding) 방식으로 결정됩니다.가상 함수의 핵심 역할: 런타임 다형성가상 함수의 가장 중요한 용도는 런타임 다형성(Runtime Polymorphism)을 구현하는 것입니다. 런타임 다형성은 오직 기본 클래스 타입의 포인터(또는 참조)를 통해서만 구현할 수 있습니다.기본

  13. C++에서 기본 인수와 가상 함수의 상호작용 완벽 이해하기

    C++ 기본 인수와 가상 함수C++에서 기본 인수(default argument)와 가상 함수(virtual function)를 함께 사용하면 의외의 동작이 발생할 수 있습니다. 그 이유는 두 기능이 처리되는 시점이 다르기 때문입니다. 핵심 개념을 쉽게 이해할 수 있도록 샘플 프로그램을 통해 살펴보겠습니다.예제 코드#include<iostream> using namespace std; class B { public: virtual void s(int a = 0) { cout<

  14. C++ 파생 클래스의 가상 함수(Virtual Function) 이해하기

    C++에서 가상 함수(virtual function)는 기반 클래스(base class) 포인터 목록을 만들어, 실제 객체가 어떤 파생 클래스(derived class)에 속하는지 알지 못한 채로도 해당 파생 클래스의 메서드를 호출할 수 있게 해주는 강력한 기능입니다. 이러한 가상 함수는 컴파일 시점이 아닌 런타임(runtime)에 늦은 바인딩(late binding) 방식으로 해석됩니다.가상 함수의 상속 규칙기반 클래스에서 한 번 가상 함수로 선언된 멤버 함수는, 그 기반 클래스로부터 파생되는 모든 클래스에서 자동으로 가상 함수가

  15. C++ 가상 소멸자(Virtual Destructor) 완벽 이해하기

    C++에서 기본(base) 클래스 포인터를 사용하여 파생(derived) 클래스 객체를 삭제할 때는 반드시 기본 클래스에 가상 소멸자(virtual destructor)를 정의해야 합니다.가상 소멸자가 없으면 기본 클래스 포인터로 객체를 삭제하는 순간 파생 클래스의 소멸자가 호출되지 않아 메모리 누수(memory leak)나 리소스 해제 누락 같은 심각한 문제가 발생할 수 있습니다. 소멸자 앞에 virtual 키워드를 붙이면, 실제 객체 타입에 맞는 소멸자가 올바른 순서대로 호출됩니다.예제 코드#include<iostream&

  16. C++ 가상 생성자(Virtual Constructor)란? 생성자는 왜 가상일 수 없는가

    C++에서 가상(virtual) 메커니즘은 기본 클래스(base class) 포인터가 파생 클래스(derived class) 객체를 가리킬 때에만 동작합니다. 즉, 다형성(polymorphism)을 활용하려면 기본 클래스 타입의 포인터나 참조를 통해 파생 클래스에서 오버라이딩한 함수를 호출해야 합니다.생성자는 가상으로 만들 수 없다C++에서는 생성자를 가상 함수로 선언하는 것이 불가능합니다. 그 이유는 다음과 같습니다.클래스의 생성자가 실행되는 시점에는 객체의 가상 테이블(vtable)이 아직 메모리에 완성되지 않은 상태입니다.가상

  17. C++로 구현하는 표현식 트리(Expression Tree) 알고리즘: 후위 표기식 변환 프로그램

    표현식 트리란? 표현식 트리(Expression Tree)는 산술 또는 논리 수식을 표현하기 위해 사용되는 이진 트리입니다. 표현식 트리에서는 내부 노드(internal node)가 연산자에 해당하고, 리프 노드(leaf node)가 피연산자에 해당합니다. 예를 들어 중위 표기식 "a+b*c"는 루트가 +, 왼쪽 자식이 a, 오른쪽 서브트리가 *를 루트로 하는 트리 형태로 표현됩니다. 이 글에서 소개하는 C++ 프로그램은 후위 표기식(postfix expression)을 입력으로 받아 이에 대응하는 표현식 트리를

  18. C++로 구현하는 퓨전 트리(Fusion Tree): 알고리즘, 전체 코드 및 실행 결과

    퓨전 트리(Fusion Tree)는 w비트(w-bit) 정수를 기반으로 연관 배열(associative array)을 구현하는 고급 트리 자료구조입니다. 이 글에서는 주어진 입력값을 바탕으로 6비트 정수 배열을 다루는 퓨전 트리를 C++로 구현하는 방법을 단계별로 살펴봅니다. 퓨전 트리란? 퓨전 트리는 B-트리의 변형된 형태로, 하나의 노드에 여러 개의 키를 저장하면서 비트 연산을 활용해 여러 키를 빠르게 비교할 수 있는 자료구조입니다. 이론적으로 n개의 요소를 저장할 때 일반적인 균형 트리보다 더 적은 비교 횟수로 검색이 가능하다

  19. C++로 구현하는 인터벌 트리(Interval Tree) 완벽 가이드

    인터벌 트리(Interval Tree)는 구간(간격) 정보를 저장하기 위한 정렬된 트리 자료구조입니다. 이 자료구조의 핵심 장점은 특정 구간이나 점과 겹치는 모든 구간을 효율적으로 탐색할 수 있다는 점입니다. 일반적인 이진 탐색 트리를 확장한 형태로, 각 노드는 구간 정보와 함께 해당 서브트리 내 최댓값(max)을 추가로 관리합니다.아래에서는 C++를 이용해 인터벌 트리를 직접 구현하는 방법을 단계별로 살펴보겠습니다.알고리즘 개요1. insert() — 새 노드 삽입시작 insert() 함수는 새 노드를 트리에 삽입하는 데

  20. C++로 구현하는 무작위 이진 검색 트리(Randomized BST) 완벽 가이드

    이진 검색 트리(Binary Search Tree, BST)는 모든 노드가 정렬된 순서를 유지하는 이진 트리 자료구조입니다. BST는 다음과 같은 핵심 속성을 만족해야 합니다.노드의 오른쪽 서브트리에 있는 모든 키는 부모 노드의 키보다 크거나 같습니다.노드의 왼쪽 서브트리에 있는 모든 키는 부모 노드의 키보다 작습니다.각 노드는 최대 두 개의 자식 노드만 가질 수 있습니다.이러한 구조 덕분에 BST에서는 검색, 삽입, 삭제 연산을 평균적으로 O(log n)의 시간 복잡도로 수행할 수 있습니다. 아래에서는 C++로 이진 검색 트리를

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:46/300  20-컴퓨터/Page Goto:1 40 41 42 43 44 45 46 47 48 49 50 51 52