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

C++

  1. C++ 타입 추론 완벽 정리: auto와 decltype의 차이와 활용법

    C++11부터 도입된 타입 추론(Type Inference) 기능은 개발자가 변수 타입을 명시적으로 작성하지 않아도 컴파일러가 자동으로 판단하도록 해주는 강력한 기능입니다. 이 글에서는 대표적인 타입 추론 키워드인 auto와 decltype의 동작 원리와 차이점을 예제 코드를 통해 살펴보겠습니다.auto란 무엇인가?auto 키워드는 초기화 값(initializer)의 타입을 기반으로 변수의 타입이 결정됩니다. 즉, 변수 선언 시 오른쪽에 있는 초기화 식을 컴파일러가 분석하여 그에 맞는 타입을 자동으로 지정합니다.auto 사용 예제#

  2. C++ 클래스로 벡터 구현하기: 연산자 오버로딩으로 배우는 벡터 연산

    벡터(vector)는 크기(magnitude)와 방향(direction)을 모두 가지는 물리량입니다. 이번 글에서는 C++의 클래스를 활용해 3차원 벡터를 직접 구현하고, 덧셈·뺄셈·내적·외적 같은 기본 연산을 수행하는 방법을 단계별로 알아보겠습니다.핵심 원리: 연산자 오버로딩C++의 연산자 오버로딩(operator overloading)을 사용하면 사용자 정의 타입에도 +, -, *, ^ 등의 연산자를 기본 자료형처럼 자연스럽게 적용할 수 있습니다. 벡터 클래스에 이 기술을 적용하면 복잡한 함수 호출 없이 수학 표현식 그대로 직관

  3. C++ 가상 기본 클래스(Virtual Base Class) 개념과 활용법

    이번 튜토리얼에서는 C++의 가상 기본 클래스(Virtual Base Class)가 무엇인지, 그리고 어떤 상황에서 사용되는지 예제 코드와 함께 자세히 알아보겠습니다.가상 기본 클래스란?가상 기본 클래스는 주로 다중 상속(Multiple Inheritance) 상황에서 사용됩니다. 여러 클래스가 동일한 기본 클래스를 상속할 때, 파생 클래스에 같은 기본 클래스의 인스턴스가 중복으로 포함되어 모호성(ambiguity) 문제가 발생할 수 있습니다.이를 흔히 다이아몬드 상속 문제(Diamond Problem)라고 부르는데, 가상 상속(v

  4. C++에서 shared_ptr을 활용한 가상 소멸 완벽 이해하기

    개요이 튜토리얼에서는 C++에서 shared_ptr을 사용한 가상 소멸(virtual destruction)이 어떻게 동작하는지 예제 프로그램을 통해 자세히 알아보겠습니다.일반적으로 클래스의 인스턴스를 안전하게 삭제하려면 기본 클래스(base class)의 소멸자를 가상(virtual) 함수로 선언해야 합니다. 이렇게 하면 파생 클래스 객체가 삭제될 때 생성된 순서의 역순, 즉 파생 클래스 소멸자부터 기본 클래스 소멸자까지 차례대로 호출됩니다.흥미로운 점은 std::shared_ptr의 경우입니다. shared_ptr은 객체를 생성

  5. C++ 가상 함수(Virtual Function) 개념과 동작 원리 쉽게 이해하기

    이 글에서는 C++의 가상 함수(Virtual Function)가 무엇인지, 그리고 어떻게 동작하는지 예제 코드를 통해 자세히 알아보겠습니다.가상 함수란?가상 함수는 기본 클래스(base class)에서 선언되고, 파생 클래스(derived class)에서 재정의(overriding)할 수 있는 멤버 함수입니다. 함수 선언 앞에 virtual 키워드를 붙여 표시합니다.가상 함수의 핵심은 런타임 다형성(runtime polymorphism)을 구현한다는 점입니다. 기본 클래스 포인터로 파생 클래스 객체를 가리킬 때, 가상 함수는 실제

  6. C++ STL을 활용한 문자열 전체 대문자·소문자 변환 방법

    이 튜토리얼에서는 C++의 STL(표준 템플릿 라이브러리)을 사용하여 문자열 전체를 대문자 또는 소문자로 변환하는 방법을 알아봅니다.C++ STL은 이러한 변환을 위해 toupper()와 tolower() 함수를 제공합니다. 각각 대문자와 소문자로 변환하는 역할을 하며, transform() 알고리즘과 함께 사용하면 문자열 전체를 한 번에 처리할 수 있습니다.예제 코드#include<bits/stdc++.h> using namespace std; int main(){ string su = Tutorials poin

  7. C++로 정렬된 배열에서 더 작은 요소 개수 세기

    개요이 튜토리얼에서는 C++를 사용하여 정렬된 배열에서 주어진 숫자보다 작은 요소의 개수를 세는 방법을 알아봅니다.정렬된 배열과 하나의 기준 숫자가 주어졌을 때, 배열 내에서 해당 숫자보다 작은 값을 가지는 모든 요소의 개수를 구하는 것이 목표입니다.upper_bound를 활용한 풀이배열이 이미 정렬되어 있기 때문에 C++ STL의 upper_bound() 함수를 사용하면 매우 간단하게 해결할 수 있습니다. upper_bound()는 정렬된 범위에서 주어진 값보다 큰 첫 번째 요소의 위치(반복자)를 반환합니다. 따라서 이 위치에서

  8. C++ STL Set을 활용해 오른쪽에 있는 더 작은 요소 개수 구하기

    이 튜토리얼에서는 C++ STL의 set 컨테이너를 활용하여 배열에서 각 요소의 오른쪽에 위치한 더 작은 요소의 개수를 계산하는 방법을 알아봅니다.하나의 정수 배열이 주어졌을 때, 새로운 배열을 생성하고 각 위치에 현재 요소보다 오른쪽에 있으면서 값이 작은 요소의 개수를 저장하는 것이 목표입니다.알고리즘 동작 원리핵심 아이디어는 배열을 오른쪽에서 왼쪽으로 순회하면서 지금까지 확인한 요소들을 set에 삽입하는 것입니다. set은 자동으로 정렬된 상태를 유지하기 때문에, lower_bound() 함수로 현재 요소의 위치를 찾으면 그 앞

  9. C++ STL을 활용해 이진 배열에서 1과 0의 개수 세기

    이 튜토리얼에서는 C++의 STL(표준 템플릿 라이브러리)을 사용하여 이진 배열에 포함된 1과 0의 개수를 세는 방법을 살펴보겠습니다.이 문제에서는 하나의 배열이 주어지며, 우리의 과제는 해당 배열 안에 존재하는 0과 1이 각각 몇 개인지 계산하는 것입니다.예제 코드#include <bits/stdc++.h> using namespace std; // 요소가 1인지 검사하는 조건자 함수 bool isOne(int i){    if (i == 1)       return true

  10. C++ STL Set을 활용한 반전(Inversion) 개수 계산 방법

    이 튜토리얼에서는 C++ STL의 set(multiset)을 사용하여 배열의 반전(inversion) 개수를 계산하는 프로그램을 다룹니다.반전 개수(Inversion Count)란?반전 개수는 배열이 완전히 정렬된 상태에 얼마나 가까운지를 나타내는 척도입니다. 배열이 이미 정렬되어 있다면 반전 개수는 0이 됩니다. 반대로 반전 개수가 클수록 배열은 정렬 상태에서 멀어진 것입니다.구체적으로, 인덱스 i < j인 두 원소 arr[i]와 arr[j]에 대해 arr[i] > arr[j]인 경우를 하나의 반전이라고 정의합니다.C+

  11. C++ STL을 활용한 길이 2의 고유한 연속 부분 문자열 개수 세기

    개요이 튜토리얼에서는 C++ STL(표준 템플릿 라이브러리)을 사용하여 문자열 내에서 길이가 2인 고유한 연속 부분 문자열의 개수를 세는 프로그램을 살펴봅니다.하나의 문자열이 입력으로 주어지며, 우리의 목표는 이 문자열에서 길이가 2인 모든 고유한 부분 문자열을 찾아내고, 각 부분 문자열이 몇 번 등장하는지 함께 출력하는 것입니다.접근 방법핵심 아이디어는 간단합니다. 문자열을 처음부터 끝까지 순회하면서 인접한 두 문자를 하나의 쌍(pair)으로 묶습니다. 그리고 C++ STL의 map<pair<char, char>,

  12. C++로 풀어보는 워드 래더(Word Ladder): BFS로 최단 변환 시퀀스 구하기

    문제 설명 두 단어(beginWord와 endWord)와 사전 역할을 하는 단어 목록이 주어졌을 때, beginWord에서 endWord까지 도달하는 최단 변환 시퀀스의 길이를 구하는 문제입니다. 변환 과정은 다음 규칙을 따릅니다. 한 번에 한 글자씩만 변경할 수 있습니다. 변환된 각 단어는 반드시 단어 목록에 존재해야 하며, beginWord는 변환된 단어에 포함되지 않습니다. 문제를 풀기 전에 다음 조건들도 함께 기억해 두어야 합니다. 가능한 변환 시퀀스가 존재하지 않으면 0을 반환합니다. 모든 단어는 길이가 서로 같습니

  13. C++로 구현하는 슈퍼 얼리 넘버(Super Ugly Number) 찾기 알고리즘

    슈퍼 얼리 넘버(Super Ugly Number)란?슈퍼 얼리 넘버는 주어진 소수 목록 primes(크기 k)에 포함된 소수들만을 인수로 가지는 양의 정수를 의미합니다. 예를 들어 n이 12이고 소수 목록이 [2, 7, 13, 19]라면, 출력 결과는 32가 됩니다. 이는 [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32]가 해당 조건을 만족하는 12번째까지의 슈퍼 얼리 넘버 시퀀스이기 때문입니다.이 문제를 해결하기 위해 우선순위 큐(priority queue)를 활용한 효율적인 접근 방식을 사용할 수 있

  14. C++로 풀어보는 House Robber III(이진 트리 도둑 문제)

    문제 개요한 도둑이 또다시 새로운 절도 대상 지역을 찾았다고 가정해 보겠습니다. 이 지역에는 입구가 단 하나뿐이며, 이 입구를 루트(root)라고 부릅니다. 루트를 제외한 모든 집은 정확히 하나의 부모 집을 가지고 있습니다. 지역을 한 바퀴 둘러본 후, 영리한 도둑은 이곳의 모든 집이 하나의 이진 트리(binary tree) 구조를 이룬다는 사실을 알게 됩니다. 또한 같은 날 밤에 직접 연결된 두 집을 동시에 털면 자동으로 경찰에 신고됩니다. 따라서 우리는 경찰에게 들키지 않으면서 도둑이 오늘 밤 훔칠 수 있는 최대 금액을 구해야

  15. C++로 문자열 내 모든 아나그램 시작 인덱스 찾는 방법

    문제 개요문자열 s와 비어 있지 않은 문자열 p가 주어졌을 때, s 안에서 p의 아나그램(anagram)이 시작되는 모든 인덱스를 찾아야 합니다. 두 문자열은 소문자 알파벳으로만 구성되며, s의 길이는 최대 20,000, p의 길이는 최대 100으로 가정합니다.예를 들어 s가 cbaebabacd이고 p가 abc라면 출력은 [0, 6]이 됩니다. 인덱스 0에서 시작하는 부분 문자열은 cba, 인덱스 6에서 시작하는 부분 문자열은 bac로, 둘 다 abc의 아나그램이기 때문입니다.해결 전략: 슬라이딩 윈도우와 문자 빈도 카운팅이 문제는

  16. C++로 해결하는 작업 스케줄러(Task Scheduler) 문제

    CPU가 수행해야 할 작업들을 나타내는 문자 배열이 있다고 가정해 봅시다. 이 배열은 대문자 A부터 Z까지로 구성되며, 서로 다른 문자는 서로 다른 작업을 의미합니다. 작업은 원래 순서와 무관하게 수행될 수 있으며, 각 작업은 하나의 인터벌(시간 단위) 안에서 완료됩니다.각 인터벌 동안 CPU는 하나의 작업을 처리하거나, 아무것도 하지 않고 대기(idle)할 수 있습니다. 여기서 중요한 조건은 음수가 아닌 쿨다운 간격(cooling interval) n입니다. 이는 동일한 두 작업 사이에 최소 n개의 인터벌 동안 CPU가 다른 작업

  17. C++로 구현하는 가장 깊은 노드를 모두 포함하는 최소 서브트리 찾기

    문제 개요루트가 root인 이진 트리가 주어졌다고 가정해 보겠습니다. 각 노드의 깊이(depth)는 루트까지의 최단 거리를 의미하며, 전체 트리에서 가장 큰 깊이를 가진 노드를 가장 깊은 노드(deepest node)라고 부릅니다. 또한 어떤 노드의 서브트리(subtree)란 그 노드 자신과 모든 자손 노드들의 집합을 말합니다.이 문제의 목표는 가장 깊은 노드들을 모두 포함하는 서브트리 중 가장 작은 것, 즉 그 서브트리의 루트가 되는 노드를 찾는 것입니다.예를 들어 다음과 같은 트리가 있다고 해봅시다.이때 가장 깊은 노드들을 모두

  18. C++로 구현하는 가능한 모든 전체 이진 트리(All Possible Full Binary Trees)

    전체 이진 트리(Full Binary Tree)는 모든 노드가 정확히 0개 또는 2개의 자식을 가지는 이진 트리를 의미합니다. 이 문제에서는 N개의 노드로 만들 수 있는 모든 전체 이진 트리의 목록을 구해야 합니다. 각 트리의 모든 노드는 node.val = 0의 값을 가져야 하며, 반환되는 트리들의 순서는 임의로 지정할 수 있습니다.예를 들어 입력이 7이라면 다음과 같은 트리들이 생성됩니다.해결 접근 방법이 문제는 재귀 호출과 메모이제이션(Memoization)을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 루트 노드

  19. C++로 푸는 부분 배열 최솟값의 합: 단조 스택 알고리즘 완벽 가이드

    문제 설명정수 배열 A가 주어졌을 때, A에서 만들 수 있는 모든 연속된(contiguous) 부분 배열 B에 대해 min(B)의 값을 구하고 그 합을 계산하는 문제입니다. 답이 매우 커질 수 있으므로 결과는 109 + 7로 나눈 나머지(modulo) 형태로 반환해야 합니다.예를 들어 입력 배열이 [3,1,2,4]라고 가정해 보겠습니다. 만들 수 있는 부분 배열은 [3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4], [3,1,2,4]로 총 10개이며, 각 부분 배열의 최솟값은 순서

  20. C++로 구현하는 완전 이진 트리 삽입기(CBTInserter)

    완전 이진 트리 삽입기란?완전 이진 트리(Complete Binary Tree)는 마지막 레벨을 제외한 모든 레벨이 가득 차 있고, 노드들이 최대한 왼쪽으로 치우쳐 배치된 이진 트리입니다. 이 문제에서는 주어진 완전 이진 트리로 초기화되는 CBTInserter라는 자료구조를 작성해야 하며, 다음 세 가지 연산을 지원해야 합니다.CBTInserter(TreeNode root) : 루트 노드가 주어진 트리로 자료구조를 초기화합니다.CBTInserter.insert(int v) : node.val = v인 새 TreeNode를 트리에 삽

Total 5981 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:146/300  20-컴퓨터/Page Goto:1 140 141 142 143 144 145 146 147 148 149 150 151 152