이 튜토리얼에서는 C++에서 처리되지 않은 예외(uncaught exception)가 발생했을 때 프로그램의 종료 동작을 사용자가 원하는 방식으로 변경하는 방법을 알아봅니다.처리되지 않은 예외란?일반적으로 C++에서는 try-catch 블록을 통해 예외를 처리합니다. 하지만 발생한 예외와 일치하는 catch 블록이 존재하지 않으면 프로그램은 곧바로 종료됩니다. 이때 내부적으로 호출되는 것이 바로 terminate() 함수입니다.중요한 점은 이 terminate() 함수의 기본 동작이 고정되어 있지 않다는 것입니다. <excep
C++의 기본 인수란 무엇인가?이 튜토리얼에서는 C++에서 기본 인수(Default Arguments)가 어떻게 동작하는지 예제 프로그램을 통해 자세히 알아보겠습니다.기본 인수란 함수를 호출하는 문장에서 해당 매개변수에 값을 전달하지 않을 경우, 함수가 자동으로 사용하도록 미리 지정해 둔 값입니다. 이를 활용하면 하나의 함수로 다양한 형태의 호출을 처리할 수 있어 코드의 유연성과 재사용성이 크게 향상됩니다.기본 인수의 주요 특징매개변수 선언 시 = 기호를 사용하여 기본값을 지정합니다.기본 인수는 반드시 오른쪽(뒤쪽)부터 순서대로 지
이 튜토리얼에서는 C/C++에서 문자열을 거꾸로 뒤집는(반전시키는) 다양한 방법을 예제 코드와 함께 살펴보겠습니다.문자열 반전은 코딩 인터뷰나 알고리즘 문제에서 자주 등장하는 기본 개념입니다. 직접 함수를 구현하는 방법부터 C++ 표준 라이브러리를 활용하는 방법까지, 상황에 맞게 선택할 수 있도록 세 가지 접근 방식을 소개합니다.1. 사용자 정의 reverse() 함수 활용가장 기본적인 방법은 문자열의 앞쪽과 뒤쪽 문자를 서로 교환(swap)하며 가운데로 이동하는 방식입니다. 문자열 길이의 절반만큼만 반복하면 되므로 효율적입니다.#
C++ 프로그램에서 더 이상 사용하지 않는 메모리를 해제하는 대표적인 방법은 delete 연산자와 free() 함수입니다. 이번 튜토리얼에서는 두 가지의 역할과 올바른 사용법을 예제 코드를 통해 살펴보겠습니다. delete와 free(), 어떤 차이가 있을까? 두 기능의 핵심 목적은 같습니다. 바로 사용이 끝난 메모리를 시스템에 반납하는 것입니다. 다만 어떤 방식으로 메모리를 할당했는지에 따라 짝이 정해집니다. delete 연산자: new로 할당한 메모리를 해제할 때 사용 free() 함수: malloc()으로 할당한 메모리를
C++ 프로그래밍을 하다 보면 생성자를 직접 정의했을 때에도 컴파일러가 여전히 기본 생성자(default constructor)를 자동으로 만들어 주는지 궁금해지는 순간이 있습니다. 이 글에서는 그 동작 원리를 간단한 코드 예제와 함께 살펴보겠습니다. 핵심 규칙 C++ 컴파일러의 기본 동작은 다음 두 가지로 정리할 수 있습니다. 생성자가 하나도 정의되어 있지 않은 경우: 컴파일러가 암시적 기본 생성자(implicit default constructor)를 자동으로 생성합니다. 사용자가 생성자를 하나라도 정의한 경우: 컴파일러는 더
C++ 그래픽에서 선 그리기이 튜토리얼에서는 C++ 그래픽 환경에서 선을 그리는 방법에 대해 알아보겠습니다.C++에서 다양한 크기와 형태의 도형을 구현하거나 애니메이션 효과를 만들 때는 graphics.h 라이브러리를 사용합니다. 이 라이브러리는 BGI(Borland Graphics Interface)를 기반으로 하며, 주로 Turbo C++와 같은 컴파일러 환경에서 활용됩니다.선 그리기 예제 코드#include <graphics.h>int main(){ int gd = DETEC
이 튜토리얼에서는 C++ 클래스를 활용하여 파일 처리(File Handling)를 구현하는 방법을 알아봅니다. C++ 파일 처리의 기본 개념 파일 입출력은 프로그램이 데이터를 영구적으로 저장하거나 외부 파일에서 데이터를 불러올 때 반드시 필요한 기능입니다. C++에서는 ifstream(입력 파일 스트림)과 ofstream(출력 파일 스트림)과 같은 스트림 클래스를 통해 파일을 손쉽게 다룰 수 있으며, 파일과 상호작용하는 데 사용되는 기본 함수들은 사용자가 직접 클래스를 정의하여 재구성하거나 확장할 수도 있습니다. 아래 예제에서는 o
이번 글에서는 C++ STL을 활용해 정렬된 배열에서 주어진 값의 floor(바닥값)과 ceil(천장값)을 찾는 방법을 알아봅니다.floor란 배열에서 해당 값보다 작거나 같은 원소 중 가장 큰 값을, ceil은 해당 값보다 크거나 같은 원소 중 가장 작은 값을 의미합니다. 배열이 이미 정렬되어 있다면, STL의 이진 탐색 기반 함수인 lower_bound()와 upper_bound()를 사용해 선형 탐색 없이 O(log n) 시간 안에 답을 구할 수 있습니다.핵심 개념 정리lower_bound(first, last, val): v
C/C++ 프로그래밍에서 정수형 데이터 타입의 크기는 생각보다 모호하게 정의되어 있습니다. 이 글에서는 컴파일러 환경에 따라 달라지는 정수형의 범위 문제를 해결해 주는 확장 정수 타입(Extended Integral Types), 즉 고정 폭 정수형에 대해 자세히 알아보겠습니다.C/C++ 기본 정수형의 문제점C 언어의 기본 데이터 타입은 매우 느슨하게 정의되어 있습니다. 예를 들어 int 타입의 실제 크기와 표현 가능한 값의 범위는 컴파일러가 32비트 환경인지, 64비트 환경인지에 따라 달라질 수 있습니다.이러한 모호함은 임베디드
이번 튜토리얼에서는 C/C++ 프로그램에서 다차원 배열(multidimensional array)을 초기화하는 방법에 대해 알아보겠습니다.다차원 배열 선언의 기본 규칙다차원 배열을 선언할 때 중요한 규칙이 하나 있습니다. 바로 가장 왼쪽(첫 번째) 차원의 크기는 비워둘 수 있지만, 나머지 모든 차원의 크기는 반드시 명시해야 한다는 점입니다.컴파일러는 초기화 목록을 보고 첫 번째 차원의 크기를 자동으로 추론할 수 있기 때문입니다. 하지만 두 번째 차원 이후의 크기를 알아야 메모리 상에서 각 행(row)의 경계를 계산할 수 있으므로,
개요이 튜토리얼에서는 C++ STL의 std::list 컨테이너에서 요소를 삭제하는 방법을 예제 프로그램과 함께 살펴보겠습니다.STL list는 내부적으로 양방향 연결 리스트(doubly linked list)로 구현되어 있기 때문에, 리스트의 맨 앞(front)과 맨 뒤(back)에서 요소를 삽입하거나 삭제할 때 상수 시간 O(1)의 성능을 보장합니다.주요 삭제 함수pop_front() : 리스트의 첫 번째 요소를 삭제합니다.pop_back() : 리스트의 마지막 요소를 삭제합니다.두 함수 모두 반환값이 없으며, 빈(empty)
이진 트리와 정수 target이 주어졌을 때, 값이 target과 같은 모든 리프 노드를 삭제해야 합니다. 중요한 점은 target 값을 가진 리프 노드를 삭제한 후, 그 부모 노드가 새로운 리프 노드가 되었고 역시 target 값을 가지고 있다면 해당 노드도 삭제해야 한다는 것입니다. 더 이상 삭제할 수 없을 때까지 이 과정을 반복합니다.예를 들어 아래와 같은 트리가 있고 target이 2라고 가정하면, 최종적으로 얻게 되는 트리는 마지막 트리와 같습니다.문제 해결 접근 방법이 문제는 재귀(후위 순회) 방식으로 해결할 수 있습니다
회문(palindrome) 문자열이 하나 주어진다고 가정해 봅시다. 정확히 한 글자를 임의의 소문자 알파벳으로 교체하여, 회문이 아닌 문자열 중 사전순으로 가장 작은 문자열을 만들어야 합니다. 교체 후 최종 문자열을 반환하며, 불가능한 경우에는 빈 문자열을 반환합니다. 예를 들어 입력이 abccba라면 출력은 aaccba가 됩니다. 접근 방법 이 문제는 그리디(greedy) 전략으로 해결할 수 있습니다. 사전순으로 가장 작은 비회문을 만들려면 다음 원칙을 따릅니다. 문자열이 사전순으로 작아지려면 앞쪽 문자를 최대한 a로 만들어야
N × M 크기의 행렬이 주어졌을 때, 각 대각선 요소들을 왼쪽 위에서 오른쪽 아래 방향으로 오름차순 정렬해야 하는 문제를 생각해 봅시다. 예를 들어 다음과 같은 행렬이 있다고 가정합니다.331122121112대각선 기준으로 정렬한 후의 결과 행렬은 다음과 같습니다.111112221233문제 해결 접근 방법이 문제는 각 대각선을 하나의 그룹으로 묶어 정렬한 뒤, 원래 위치에 다시 배치하는 방식으로 해결할 수 있습니다. 핵심 아이디어는 같은 대각선에 속하는 좌표 (i, j)는 항상 i - j 값이 동일하다는 점입니다. 알고리즘 단계는
레스토랑 정보가 담긴 배열이 있다고 가정해 보겠습니다. 각 레스토랑 restaurants[i]는 [id, rating(평점), veganFriendly(채식 친화 여부), price(가격), distance(거리)] 형태의 데이터를 담고 있습니다. 이번 문제에서는 세 가지 필터 조건을 사용해 레스토랑을 걸러내야 합니다.채식 친화 필터(veganFriendly): 값이 true(1)이면 채식 친화로 표시된 레스토랑만 포함하고, false(0)이면 모든 레스토랑을 포함할 수 있습니다.최대 가격 필터(maxPrice): 고려 대상 레스토
0부터 n-1까지 번호가 매겨진 n개의 도시가 있다고 가정해 봅시다. 배열 edges가 주어지며, edges[i] = [fromi, toi, weighti]는 fromi와 toi 두 도시 사이의 양방향 가중치 간선을 나타냅니다. 또한 정수형 distanceThreshold(거리 임계값)가 주어집니다.이때 우리가 찾아야 하는 것은, 어떤 경로를 통해 도달 가능하면서 그 거리가 distanceThreshold 이하인 도시들의 개수가 가장 적은 도시입니다. 만약 그런 도시가 여러 개라면, 번호가 가장 큰 도시를 반환해야 합니다.예를 들어
문제 개요배열 arr가 주어졌다고 가정해 봅시다. 우리는 정수들의 집합을 하나 선택한 뒤, 그 정수들이 배열에 등장하는 모든 항목을 한 번에 제거할 수 있습니다. 이때 목표는 배열 전체 원소의 절반 이상을 제거하기 위해 필요한 집합의 최소 크기를 구하는 것입니다.예를 들어 arr = [3,3,3,3,5,5,5,2,2,7]인 경우를 살펴보겠습니다. 이때 출력값은 2입니다. 그 이유는 다음과 같습니다.{3, 7}을 선택하면 새 배열은 [5, 5, 5, 2, 2]가 되고, 크기는 5로 원래 배열 크기(10)의 절반과 같습니다.크기가 2인
정수 배열 arr와 두 개의 정수 k, threshold가 주어졌을 때, 크기가 k이고 평균이 임계값(threshold)보다 크거나 같은 부분 배열(sub-array)의 개수를 구하는 문제입니다.예를 들어, 입력이 다음과 같다고 가정해 보겠습니다.arr = [2,2,2,2,5,5,5,8]k = 3threshold = 4이 경우 출력은 3이 됩니다. 조건을 만족하는 부분 배열은 [2,5,5], [5,5,5], [5,5,8]이며, 각각의 평균은 4, 5, 6으로 모두 임계값 4 이상이기 때문입니다.문제 해결 접근 방법이 문제는 슬라이딩
문제 개요시(hour)와 분(minute)이라는 두 숫자가 주어졌을 때, 시침과 분침 사이에 형성되는 더 작은 각도(60분법 단위)를 구하는 것이 이 문제의 목표입니다.예를 들어 hour = 12, min = 30이 입력으로 주어지면, 시침은 정확히 12와 1 사이의 절반 지점에 있고 분침은 6을 가리키므로 두 바늘 사이의 각도는 165°가 됩니다.핵심 아이디어각 바늘이 1분당 얼마나 회전하는지 이해하면 공식을 쉽게 유도할 수 있습니다.분침: 60분 동안 360°를 회전하므로 1분당 6°씩 움직입니다.시침: 12시간(= 720분)
크기가 같은 두 문자열 s와 t가 있다고 가정해 봅시다. 한 단계(step)마다 t의 임의의 문자 하나를 선택해 다른 문자로 교체할 수 있습니다. 목표는 t를 s의 아나그램(anagram)으로 만들기 위해 필요한 최소 단계 수를 구하는 것입니다.참고로, 어떤 문자열의 아나그램이란 동일한 문자들로 구성되어 있으면서 순서가 다르거나(또는 같은) 문자열을 의미합니다.예를 들어 입력이 yxy와 xyx라면 문자 하나만 교체하면 되므로 결과는 1이 됩니다.접근 방법핵심 아이디어는 두 문자열에 공통으로 등장하는 문자의 개수를 세는 것입니다. 전