자바(Java)와 C++는 수십 년간 소프트웨어 개발의 중심에 있어 온 대표적인 프로그래밍 언어입니다. 두 언어는 문법적으로 유사한 면이 있지만, 설계 철학과 동작 방식에서는 큰 차이를 보입니다. 이 글에서는 두 언어의 탄생 배경부터 핵심적인 기술적 차이까지 한눈에 비교해 살펴봅니다. 두 언어의 탄생 배경 자바는 1995년 썬 마이크로시스템즈(Sun Microsystems)의 제임스 고슬링(James Gosling)이 개발한 언어로, 에이다 83(Ada 83), 파스칼(Pascal), C++ 등의 영향을 받았습니다. 한편 C++는
C++ 프로그래밍에서 복사 생성자(Copy Constructor)와 대입 연산자(Assignment Operator)는 모두 객체를 복사하는 데 사용되지만, 동작 방식과 사용 시점에 중요한 차이가 있습니다. 이 글에서는 두 개념의 차이점을 명확하게 정리해 드립니다.복사 생성자(Copy Constructor)란?복사 생성자는 오버로드된 생성자의 한 종류입니다.이미 존재하는 객체의 데이터나 값을 사용하여 새로운 객체를 초기화합니다.기존 객체를 기반으로 새로운 객체를 생성할 때 사용됩니다.원본 객체와 복사된 객체는 각각 서로 다른 메모리
C++ 프로그래밍에서 인라인(inline) 함수와 매크로(macro)는 모두 함수 호출 오버헤드를 줄여 실행 속도를 높이기 위해 사용되지만, 처리 방식과 동작 특성에서 큰 차이가 있습니다. 이 글에서는 두 개념의 차이점을 항목별로 자세히 살펴보겠습니다. 인라인(Inline) 함수란? C++의 실제 함수입니다. 컴파일러에 의해 해석(parsing)됩니다. 클래스 내부 또는 외부 어디서든 정의할 수 있습니다. 인자를 단 한 번만 평가합니다. 컴파일러가 모든 함수를 인라인으로 변환하고 확장하는 것은 아닙니다. 클래스 내부에 정의된 짧
C++에서 함수 오버로딩(Function Overloading)과 함수 오버라이딩(Function Overriding)은 이름은 비슷하지만 동작 방식과 적용 시점이 완전히 다른 개념입니다. 이 글에서는 두 개념의 차이점을 항목별로 정리하고, 비교표를 통해 한눈에 이해할 수 있도록 설명합니다. 함수 오버로딩(Overloading)이란? 오버로딩은 같은 이름의 함수를 매개변수의 개수나 타입을 다르게 하여 여러 번 정의하는 기법입니다. 별도의 키워드 없이 사용할 수 있습니다. 함수 원형(prototype)은 매개변수의 개수나 타입에 따
개요 이 튜토리얼에서는 주어진 수가 k-거친 수(k-rough number) 또는 k-재그드 수(k-jagged number)인지 판별하는 프로그램을 C++로 작성해 보겠습니다. 가장 작은 소인수가 주어진 값 k보다 크거나 같은 수를 k-거친 수 또는 k-재그드 수라고 부릅니다. 예를 들어 75 = 3 × 5 × 5이므로 가장 작은 소인수는 3이고, k가 3일 때 75는 3-거친 수가 됩니다. 문제 해결 접근 방법 이 문제는 다음 단계를 거쳐 해결할 수 있습니다. 두 수 n과 k를 초기화합니다. n의 모든 소인수를 찾아 벡터(ve
이 튜토리얼에서는 ab 값에서 오른쪽부터 세어 k번째에 해당하는 자릿수를 찾는 프로그램을 C++로 작성해 보겠습니다.문제 자체는 비교적 간단한 편입니다. 핵심은 ab를 계산한 뒤, 일의 자리부터 차례대로 숫자를 추출하면서 원하는 위치의 자릿수를 찾아내는 것입니다. 그럼 해결 단계를 하나씩 살펴보겠습니다.해결 접근 방법숫자 a, b, k를 초기화합니다.pow 함수를 사용하여 ab 값을 계산합니다.거듭제곱 값이 0보다 크고 카운트가 k보다 작은 동안 반복하는 루프를 작성합니다.거듭제곱 값에서 마지막 자릿수(일의 자리)를 추출합니다.카운
이 튜토리얼에서는 정렬된 두 배열을 하나로 병합한 뒤, 그 결과에서 K번째 요소를 찾는 프로그램을 C++로 작성해 보겠습니다.이 문제는 병합 정렬(Merge Sort)의 핵심 아이디어인 두 포인터를 이용한 병합 기법을 활용하면 간단하게 해결할 수 있습니다.문제 해결 접근 방식문제를 해결하는 단계는 다음과 같습니다.정렬된 두 개의 배열을 초기화합니다.두 배열의 길이의 합(m + n)만큼의 크기를 가진 새로운 배열을 준비합니다.두 배열을 순회하면서 작은 값부터 차례대로 새 배열에 병합합니다.병합이 완료된 배열에서 k번째 요소(인덱스 k
이 튜토리얼에서는 최대 힙(max-heap)에서 k번째로 큰 요소를 찾는 프로그램을 작성해 보겠습니다.힙 전체를 정렬하지 않고도 문제를 해결할 수 있는 효율적인 방법은 우선순위 큐(priority queue)를 활용하는 것입니다. 프로그램을 완성하기 위한 단계를 살펴보겠습니다.문제 해결 접근 방법올바른 값으로 최대 힙을 초기화합니다.우선순위 큐를 생성하고 최대 힙의 루트 노드(가장 큰 값)를 삽입합니다.k - 1번 반복하는 루프를 작성합니다.큐에서 가장 큰 요소를 꺼냅니다(pop).꺼낸 노드의 왼쪽 자식과 오른쪽 자식을 우선순위 큐
이 튜토리얼에서는 주어진 정렬되지 않은 배열에서 k번째 누락된 요소를 찾는 프로그램을 작성해 보겠습니다.즉, 배열의 최솟값(min)부터 최댓값(max) 사이에 존재하지 않는 숫자들 중에서 k번째에 해당하는 값을 찾는 것이 목표입니다. 그럼 문제를 해결하는 단계를 하나씩 살펴보겠습니다.문제 해결 접근 방식정렬되지 않은 배열을 초기화합니다.빠른 탐색을 위해 모든 배열 요소를 unordered_set에 삽입합니다.배열에서 최댓값과 최솟값을 구합니다.최솟값부터 최댓값까지 반복하는 루프를 작성하고, 누락된 개수를 세기 위한 변수(count)
이 튜토리얼에서는 주어진 정렬된 배열에서 k번째 누락된 요소를 찾는 프로그램을 작성해 보겠습니다.배열의 최솟값부터 최댓값 사이에서 빠져 있는 숫자들 중 k번째 숫자를 찾는 것이 목표입니다. 예를 들어 배열이 {1, 2, 3, 5, 10}이고 k가 3이라면, 누락된 숫자는 4, 6, 7, 8, 9이므로 세 번째로 누락된 숫자인 7을 반환해야 합니다.문제 해결 접근 방식문제를 해결하는 단계는 다음과 같습니다.정렬된 배열을 초기화합니다.두 변수 difference와 count를 선언하고, count는 k 값으로 초기화합니다.배열을 처음부
이 튜토리얼에서는 자연수에서 일부 정수를 제거한 이후 남아 있는 수 중에서 K번째로 작은 값을 찾는 프로그램을 C++로 작성해 보겠습니다.문제 개요정수 배열 하나와 값 k가 주어집니다. 자연수 중에서 주어진 배열에 포함된 모든 숫자를 제거하고, 남은 자연수들 가운데 k번째로 작은 수를 구하는 것이 목표입니다.예를 들어 배열이 {3, 5}이고 k = 2라고 가정해 봅시다. 자연수 1, 2, 3, 4, 5... 중에서 3과 5를 제거하면 1, 2, 4, 6, 7...이 남습니다. 이때 두 번째로 작은 수는 2입니다.해결 접근 방식문제를
개요 이 튜토리얼에서는 k번째 붐 넘버(k-th Boom Number)를 찾는 C++ 프로그램을 작성해 보겠습니다. 여기서 붐 넘버(Boom Number)란 숫자 2와 3으로만 구성된 수를 의미합니다. 예를 들어 2, 3, 22, 23, 32, 33, 222처럼 각 자릿수가 2 또는 3으로만 이루어진 수들이 모두 붐 넘버에 해당합니다. 문제 해결 접근 방식 붐 넘버는 2와 3으로만 이루어져 있으므로, 큐(queue)를 활용한 BFS(너비 우선 탐색) 방식으로 차례대로 생성할 수 있습니다. 문제를 해결하는 단계는 다음과 같습니다.
이 튜토리얼에서는 최소 힙(min-heap)에서 K번째로 작은 요소를 찾는 프로그램을 작성해 보겠습니다.이 문제는 우선순위 큐(priority queue)를 활용하면 효율적으로 해결할 수 있습니다. 힙 전체를 정렬하지 않고도 원하는 값을 찾을 수 있는 방법으로, 프로그램 완성을 위한 단계를 하나씩 살펴보겠습니다.문제 해결 단계올바른 값으로 최소 힙을 초기화합니다.우선순위 큐를 생성하고 최소 힙의 루트 노드를 삽입합니다.(k - 1)번 반복하는 루프를 작성합니다.큐에서 가장 작은 요소를 꺼냅니다(pop).꺼낸 노드의 왼쪽 자식과 오른
개요이 튜토리얼에서는 정렬되지 않은 배열에서 k번째로 작은 숫자를 찾는 C++ 프로그램을 작성해 보겠습니다.문제 해결 과정은 다음 단계로 진행됩니다.배열과 k 값을 초기화합니다.sort 메서드를 사용하여 배열을 오름차순으로 정렬합니다.인덱스 k - 1에 해당하는 배열 요소를 반환합니다.배열을 오름차순으로 정렬하면 가장 작은 값부터 차례대로 배치되므로, k번째로 작은 값은 항상 인덱스 k - 1 위치에 있습니다. 반대로 k번째로 큰 값을 구하고 싶다면 인덱스 n - k 위치의 값을 반환하거나 내림차순으로 정렬하면 됩니다.예제 코드#i
이 튜토리얼에서는 정렬되지 않은 배열에서 k번째로 작은 수를 찾는 프로그램을 C++의 STL(표준 템플릿 라이브러리)을 활용해 작성하는 방법을 알아보겠습니다. STL의 set 컨테이너는 내부적으로 균형 이진 탐색 트리(레드-블랙 트리) 기반으로 구현되어 있어, 원소가 자동으로 오름차순으로 정렬되고 중복 없이 저장됩니다. 이러한 특성 덕분에 k번째 작은 수를 손쉽게 구할 수 있습니다. 문제 해결 단계 배열과 k값을 초기화합니다. 비어 있는 ordered set(정렬된 집합)을 하나 생성합니다. 배열을 순회하며 각 원소를 집합에 삽
카프레카 수란 무엇일까요?이 튜토리얼에서는 주어진 숫자가 카프레카 수(Kaprekar Number)인지 아닌지 판별하는 프로그램을 C++로 작성해 보겠습니다.카프레카 수는 다음과 같은 특징을 가진 수입니다.어떤 수를 제곱합니다.제곱한 결과를 두 부분으로 나눕니다.두 부분의 합이 원래 수와 같다면, 그 수를 카프레카 수라고 부릅니다.예를 들어 45를 살펴보겠습니다. 45의 제곱은 2025이며, 이를 20과 25로 나누면 20 + 25 = 45로 원래 수와 일치합니다. 따라서 45는 카프레카 수입니다. 대표적인 카프레카 수로는 1, 9
이 튜토리얼에서는 C++을 사용해 주어진 숫자가 키스 수(Keith Number)인지 아닌지 판별하는 프로그램을 작성해 보겠습니다.키스 수란 무엇인가?어떤 수 n의 자릿수들로 수열을 만들었을 때, 그 수열 안에 n 자신이 다시 나타난다면 n을 키스 수라고 부릅니다. 이 수열은 다음과 같은 규칙으로 생성됩니다.수열의 첫 항들은 숫자 n의 각 자릿수입니다.이후의 항들은 앞선 n개 항(자릿수 개수만큼)의 합으로 재귀적으로 계산됩니다.예를 들어 14를 살펴보겠습니다. 자릿수는 1과 4이므로 수열은 다음과 같이 진행됩니다.1 → 4 → (1
이 튜토리얼에서는 수직선 위에 놓인 여러 선분들의 합집합(union)의 총 길이를 구하는 프로그램을 작성해 보겠습니다.각 선분의 시작점과 끝점이 주어졌을 때, 이 선분들이 서로 겹치는 부분을 중복 계산하지 않고 전체가 덮는 구간의 실제 길이를 구하는 것이 목표입니다. 이 문제를 효율적으로 해결하는 대표적인 방법이 바로 클리(Klee) 알고리즘입니다.클리 알고리즘의 동작 원리클리 알고리즘은 모든 선분의 시작점과 끝점을 하나의 배열에 모아 정렬한 뒤, 좌표를 순서대로 훑으면서 현재 몇 개의 선분이 활성화되어 있는지를 카운터로 추적하는
이번 튜토리얼에서는 이진 트리(binary tree)를 대각선 순회(diagonal traversal)했을 때 k번째 노드를 찾는 프로그램을 C++로 작성해 보겠습니다.대각선 순회란 루트 노드에서 시작해 오른쪽 자식들을 따라 같은 대각선 상의 노드를 먼저 모두 방문하고, 왼쪽 자식은 다음 대각선으로 넘겨 탐색하는 방식입니다. 이 문제는 큐(queue) 자료구조를 활용하면 효율적으로 해결할 수 있습니다.문제 해결 접근 방법문제를 해결하기 위한 단계는 다음과 같습니다.샘플 데이터로 이진 트리를 초기화합니다.찾고자 하는 순서 값 k를 초
이 튜토리얼에서는 주어진 배열에서 k번째 홀수를 찾는 프로그램을 C++로 작성해 보겠습니다. 배열을 한 번만 순회하면서 간단하게 해결할 수 있는 문제입니다.문제 해결 접근 방식문제를 해결하는 단계는 다음과 같습니다.배열과 k 값을 초기화합니다.배열을 처음부터 끝까지 순회합니다.현재 요소가 홀수라면 k의 값을 1 감소시킵니다.k가 0이 되면 해당 요소가 바로 k번째 홀수이므로 이를 반환합니다.배열을 모두 순회했는데도 k번째 홀수를 찾지 못했다면 -1을 반환합니다.예제 코드위 알고리즘을 구현한 전체 코드를 살펴보겠습니다.#include