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

C++

  1. C++ 멤버 함수 내 정적 변수, 동작 원리 제대로 이해하기

    C++ 멤버 함수의 정적 변수란?멤버 함수 내부에서 정적(static) 변수는 static 키워드를 사용해 선언합니다. 정적 변수는 프로그램 실행 중 단 한 번만 메모리 공간이 할당되며, 프로그램이 종료될 때까지 해당 공간을 계속 사용합니다. 또한 전체 프로그램에서 이 변수의 복사본은 오직 하나만 존재한다는 점이 핵심 특징입니다.즉, 클래스의 객체를 여러 개 생성하더라도 정적 변수는 모든 객체가 공유하는 단일 값만 가지게 됩니다. 이러한 성질 때문에 함수 호출 횟수 카운팅이나 상태 유지 등에 유용하게 활용됩니다.예제 코드다음은 C+

  2. C++에서 정적 객체는 언제 소멸될까?

    정적(static) 객체는 static 키워드를 사용하여 선언합니다. 이러한 객체는 프로그램 실행 중 단 한 번만 초기화되며, 일반적인 스택이 아닌 정적 저장 영역(static storage area)에 저장됩니다. 정적 객체는 프로그램이 종료될 때 비로소 소멸됩니다. 즉, main() 함수가 끝난 후에도 객체는 메모리에 남아 있다가 프로그램 종료 시점에 소멸자가 호출되면서 사라집니다.다음 예제를 통해 C++에서 정적 객체가 어떻게 동작하는지 확인해 보겠습니다.예제 코드#include <iostream> using nam

  3. C++ 함수에서 배열 매개변수의 크기를 출력하는 방법 완벽 정리

    C++ 함수에서 배열 매개변수의 크기 출력하기C++에서는 sizeof() 연산자를 사용하여 데이터 타입이나 변수의 크기를 바이트 단위로 확인할 수 있습니다. 하지만 배열을 함수의 매개변수로 전달할 때는 주의해야 할 점이 있습니다. 배열이 함수로 전달되면 실제 배열이 아니라 포인터로 자동 변환(배열 감쇠, Array Decay)되기 때문입니다.아래 프로그램은 이러한 현상을 보여주는 대표적인 예제입니다.예제 코드#include <iostream>using namespace std;int func(int a[]) { 

  4. C++에서 정적 클래스를 구현하는 방법 완벽 가이드

    C++에는 정적 클래스가 존재하지 않습니다C++에는 Java나 C#처럼 언어 차원에서 제공되는 정적(static) 클래스 문법이 없습니다. 대신 가장 근접한 방식은 정적 데이터 멤버와 정적 메서드만으로 구성된 클래스를 작성하는 것입니다.클래스의 정적 데이터 멤버는 해당 클래스의 모든 객체가 공유합니다. 객체의 개수와 관계없이 메모리에는 단 하나의 복사본만 존재하기 때문입니다. 또한 정적 메서드는 정적 데이터 멤버, 다른 정적 메서드, 그리고 클래스 외부의 함수에만 접근할 수 있다는 점도 기억해야 합니다.다음 프로그램은 C++에서 정

  5. 동적 계획법(Dynamic Programming)으로 0-1 배낭 문제를 해결하는 C++ 프로그램

    이 글에서는 동적 계획법(Dynamic Programming)을 활용해 0-1 배낭 문제(0-1 Knapsack Problem)를 해결하는 C++ 프로그램을 소개합니다. 0-1 배낭 문제란 각각 고유한 무게와 가치를 가진 여러 아이템이 주어졌을 때, 배낭의 용량 한도를 초과하지 않으면서 담을 수 있는 아이템들의 총 가치를 최대화하는 조합을 찾는 문제입니다. 각 아이템은 배낭에 넣거나(1) 넣지 않거나(0) 둘 중 하나만 선택할 수 있기 때문에 0-1이라는 이름이 붙었습니다.알고리즘시작 무게와 가치를 가진 아이템 집합을 입력받는다 배

  6. C++로 구현하는 셰이커 정렬(Shaker Sort) 프로그램

    셰이커 정렬(Shaker Sort)은 주어진 데이터를 정렬하기 위해 사용되는 알고리즘입니다. 흔히 칵테일 정렬 또는 양방향 버블 정렬이라고도 불리며, 일반적인 버블 정렬과 달리 배열을 양쪽 방향(정방향과 역방향)으로 번갈아 가며 탐색하면서 정렬을 수행합니다. 이러한 양방향 접근 덕분에 배열 끝에 있는 작은 값(거북이 문제, turtle problem)이 한 번의 패스만으로 앞쪽으로 이동할 수 있어, 특정 상황에서는 버블 정렬보다 유리합니다. 이 알고리즘의 최악의 경우 시간 복잡도는 O(n²)입니다.알고리즘시작 ShakerSo

  7. C++로 구현하는 스투지 정렬(Stooge Sort) 프로그램

    스투지 정렬(Stooge Sort)은 주어진 데이터를 정렬하는 재귀 기반 정렬 알고리즘입니다. 이 알고리즘은 배열을 서로 겹치는 두 부분, 즉 각각 전체 길이의 2/3 크기로 나눈 뒤, 첫 번째 부분 → 두 번째 부분 → 다시 첫 번째 부분 순서로 세 단계에 걸쳐 정렬을 수행합니다. 최악의 경우 시간 복잡도는 O(n^2.7095)로 효율성은 떨어지지만, 재귀와 분할 정복 개념을 이해하기 좋은 교육용 예제로 활용됩니다.알고리즘 동작 과정시작 정렬할 데이터를 입력받는다. 배열 a와 값의 개수 n을 인자로 하여 StoogeSort

  8. C++로 구현하는 랜덤화 퀵 정렬(Quick Sort) 프로그램: 최악의 경우 방지 기법

    퀵 정렬(Quick Sort)은 분할 정복(Divide-and-Conquer) 기법에 기반한 대표적인 정렬 알고리즘입니다. 평균 시간 복잡도는 O(n·log n)으로 매우 효율적이지만, 피벗 선택이 운 나쁘게 이루어질 경우 최악의 경우 O(n²)까지 성능이 저하될 수 있습니다.이러한 최악의 경우 발생 가능성을 줄이기 위해, 이 글에서는 랜덤화(Randomization)를 적용한 퀵 정렬을 C++로 구현하는 방법을 소개합니다. 피벗을 무작위로 선택하면 이미 정렬된 배열과 같은 편향된 입력에서도 균형 잡힌 분할을 기대할 수 있습니다.알

  9. C++로 비교하는 이진 탐색 vs 순차 탐색: 어느 쪽이 더 빠를까?

    이진 탐색(Binary Search)과 순차 탐색(Sequential Search, 선형 탐색)은 컴퓨터 프로그래밍에서 배열 안의 특정 요소를 찾을 때 널리 사용되는 대표적인 탐색 알고리즘입니다. 이진 탐색의 시간 복잡도는 O(log n), 순차 탐색의 시간 복잡도는 O(n)입니다. 이진 탐색은 탐색 범위를 절반씩 줄여 나가기 때문에 데이터가 많을수록 압도적으로 빠르지만, 배열이 반드시 정렬되어 있어야 한다는 전제 조건이 필요합니다. 반면 순차 탐색은 처음부터 끝까지 하나씩 비교하므로 상대적으로 느리지만, 정렬되지 않은 데이터에서

  10. 자기 조직화 리스트(Self-Organizing List)로 검색을 수행하는 C++ 프로그램

    자기 조직화 리스트(Self-Organizing List)는 마지막으로 검색된 항목을 기준으로 리스트의 순서를 스스로 갱신하는 자료구조입니다. 이 방식에서는 기본적으로 순차 탐색(Sequential Search)이 사용되며, 자주 검색되는 중요한 데이터를 리스트의 맨 앞으로 이동시켜 이후의 탐색 속도를 높입니다. 이 탐색 기법의 시간 복잡도는 O(n)입니다. 동작 원리 자기 조직화 리스트의 검색 알고리즘은 다음과 같이 동작합니다. Begin Function SearchItem(head, item). 헤드 노드의 값이

  11. C++로 구현하는 이진 탐색 알고리즘: 배열에서 특정 검색 시퀀스 찾기

    이 글에서는 정렬된 배열 안에서 특정 검색 시퀀스(연속된 숫자 나열)의 존재 여부를 확인하는 이진 탐색(Binary Search) 알고리즘을 C++로 구현하는 방법을 소개합니다. 이진 탐색은 탐색 범위를 절반씩 줄여가며 값을 찾는 대표적인 탐색 기법으로, 시간 복잡도는 O(log n)으로 매우 효율적입니다. 단, 이진 탐색이 올바르게 동작하려면 배열이 반드시 오름차순으로 정렬되어 있어야 한다는 점에 유의해야 합니다. 필요한 단계와 의사 코드(Pseudocode) 프로그램의 전체적인 동작 흐름은 다음과 같습니다. Begin

  12. C++로 구현하는 이진 탐색 트리(BST) 요소 검색 프로그램

    이 글에서는 이진 탐색 트리(Binary Search Tree, BST)에 특정 값이 존재하는지 확인하기 위해 이진 탐색을 C++로 구현하는 방법을 소개합니다. 이진 탐색의 최악의 경우 시간 복잡도는 O(n)이지만, 평균적인 경우에는 O(log n)으로 매우 효율적으로 동작합니다.동작 원리프로그램의 전체 흐름은 다음과 같습니다.정렬되지 않은 데이터 배열의 값을 하나씩 트리에 삽입하여 이진 탐색 트리를 구성합니다.BST에서 찾고자 하는 값을 사용자로부터 입력받습니다.루트 노드에서 시작해 입력값과 노드의 값을 비교하며 왼쪽 또는 오른쪽

  13. 맥스 힙을 활용해 시퀀스에서 k번째로 큰 요소를 찾는 C++ 프로그램

    이 글에서는 시퀀스(배열)에 저장된 데이터 중 k번째로 큰 요소를 추출하는 C++ 프로그램을 살펴봅니다. 모든 데이터를 정렬한 뒤 인덱스로 접근하는 방식보다, 맥스 힙(Max-Heap)을 활용하면 전체 정렬 없이도 원하는 값을 효율적으로 얻을 수 있습니다. 이 기법의 시간 복잡도는 O(n + k·log(n))으로, k값이 작을수록 일반 정렬 방식보다 유리합니다.알고리즘힙의 최댓값(루트 노드)을 시퀀스의 마지막 위치로 보낸다.남은 시퀀스를 대상으로 힙 재정렬(Heapify)을 수행한다.위 과정을 총 k번 반복한다.배열의 최종 상태를

  14. 피보나치 수를 활용한 분할 정복 기반 정렬 배열 검색 C++ 프로그램

    이 C++ 프로그램은 분할 정복(Divide and Conquer) 기법과 피보나치 수(Fibonacci Number)를 활용한 피보나치 탐색(Fibonacci Search)을 구현합니다. 피보나치 수열의 값을 이용해 정렬된 데이터 배열의 탐색 위치(mid)를 계산하고, 그 위치를 기준으로 원하는 데이터 항목을 찾아냅니다. 이 방식의 시간 복잡도는 O(log(n))로, 이진 탐색과 동일한 수준의 효율성을 보입니다.피보나치 탐색의 동작 원리피보나치 탐색은 정렬된 배열에서 특정 요소를 찾는 알고리즘이라는 점에서 이진 탐색(Binary

  15. C++로 구현하는 균일 이진 검색(Uniform Binary Search) 프로그램

    균일 이진 검색(Uniform Binary Search)은 룩업 테이블(lookup table)을 활용하여 이진 검색을 구현하는 기법입니다. 일반적인 이진 검색에서는 매 단계마다 중간 위치를 계산하기 위해 시프트와 덧셈 연산을 반복해야 하지만, 균일 이진 검색은 미리 계산해 둔 오프셋 테이블을 조회하기만 하면 되므로 실행 속도가 더 빠릅니다. 이 방식의 시간 복잡도는 O(log(n))으로 일반 이진 검색과 동일하지만, 상수 수준의 성능 개선 효과를 얻을 수 있습니다.알고리즘시작 데이터를 정렬된 상태로 배열에 저장한다.

  16. 선형 검색(Linear Search)으로 배열의 최솟값을 찾는 C++ 프로그램

    이 글에서는 선형 검색(Linear Search) 방식을 활용해 배열에서 최소 요소를 찾는 C++ 프로그램을 소개합니다. 선형 검색은 배열의 첫 번째 요소부터 마지막 요소까지 순서대로 하나씩 비교해가는 가장 기본적인 탐색 기법으로, 이 프로그램의 시간 복잡도는 O(n)입니다.알고리즘선형 검색으로 배열의 최솟값을 찾는 절차는 다음과 같습니다.Begin 배열에 데이터 요소를 저장한다. 인덱스 0에 있는 값을 minimum 변수에 대입한다. minimum 값을 배열의 나머지 요소들과 순서대로 비교한다. 특정 인덱스의

  17. C++ 이진 탐색 트리로 배열의 최댓값 찾기 – O(log n) 구현 방법

    이 글에서는 C++를 사용해 이진 탐색 트리(Binary Search Tree)를 활용하여 배열(데이터 집합)에서 최댓값을 찾는 방법을 소개합니다. 이진 탐색 트리에서는 항상 가장 오른쪽 끝에 있는 노드가 최댓값을 가지므로, 루트에서 오른쪽 자식 노드만 따라 이동하면 최댓값을 빠르게 찾을 수 있습니다. 균형 잡힌 트리를 기준으로 할 때 이 프로그램의 시간 복잡도는 O(log n)입니다. 동작 원리 이진 탐색 트리는 다음과 같은 규칙을 따릅니다. 부모 노드보다 작은 값은 왼쪽 서브트리에 위치합니다. 부모 노드보다 큰 값은 오른쪽

  18. 이진 검색 접근 방식을 사용해 배열의 최소 요소를 찾는 C++ 프로그램

    이 글에서는 이진 검색 접근 방식을 사용하여 정렬되지 않은 배열에서 최소 요소를 찾는 C++ 프로그램을 소개합니다. 먼저 주어진 데이터로 이진 검색 트리(Binary Search Tree)를 구성한 뒤, 루트에서 가장 왼쪽 끝에 있는 노드로 이동하면 그 값이 곧 전체 데이터의 최솟값이 됩니다. 이 방식의 시간 복잡도는 O(log(n))입니다.알고리즘시작 주어진 정렬되지 않은 데이터 배열에 대해 이진 검색 트리를 구성합니다. 최소 요소를 찾기 위해 포인터를 가장 왼쪽 자식 노드로 이동합니다. 이 값을 주어진 데이터 집

  19. C++ 이진 탐색(Binary Search)으로 배열의 피크 요소 찾기

    이 글에서는 C++ 프로그램을 통해 이진 탐색(Binary Search) 기법으로 배열 내 피크(peak) 요소 중 하나를 찾는 방법을 알아봅니다. 피크 요소란 자신의 이웃한 요소보다 큰 값을 가지는 요소를 의미하며, 이 알고리즘은 가장 먼저 발견되는 피크를 결과로 반환합니다. 시간 복잡도는 O(log(n))으로 매우 효율적입니다.피크 요소란?배열에서 피크 요소는 다음 조건 중 하나를 만족하는 요소입니다.양쪽에 이웃이 있는 경우: 인접한 두 요소보다 모두 커야 합니다.경계(첫 번째 또는 마지막) 요소인 경우: 인접한 하나의 요소보다

  20. C++로 주어진 간선 개수만큼 방향성 비순환 그래프(DAG)를 생성하는 프로그램

    이 글에서는 주어진 간선 수 e에 대해 무작위 방향성 비순환 그래프(DAG, Directed Acyclic Graph)를 생성하는 C++ 프로그램을 살펴봅니다. 방향성 비순환 그래프란 간선에 방향이 부여되어 있으면서, 어떤 정점에서 출발하더라도 다시 자기 자신에게 돌아오는 경로(사이클)가 하나도 존재하지 않는 그래프를 의미합니다. 본 프로그램의 시간 복잡도는 O(e·v·e)입니다. 알고리즘 시작 GenerateRandomGraphs() 함수는 인자로 간선의 개수 e를 전달받습니다. 두 개의 무작위 정점 사이에 연결을 생

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:27/300  20-컴퓨터/Page Goto:1 21 22 23 24 25 26 27 28 29 30 31 32 33