C++11부터 도입된 균일 초기화(Uniform Initialization)는 변수와 객체를 초기화할 때 하나의 일관된 문법을 사용할 수 있게 해주는 기능입니다. 기본 자료형(int, double 등)부터 배열, 클래스 객체에 이르기까지 모든 타입에 동일한 방식을 적용할 수 있습니다.핵심은 중괄호 초기화(brace-initialization)입니다. 말 그대로 중괄호 {}를 사용해 초기화 값을 감싸는 방식으로, 코드의 가독성을 높이고 초기화 문법의 혼란을 줄여줍니다.기본 문법type var_name{argument_1, argume
이 글에서는 C++의 사용자 정의 리터럴(User Defined Literals, UDL) 개념에 대해 알아보겠습니다. UDL은 C++11 버전부터 도입된 기능으로, 기존에 제한적이었던 내장 리터럴의 한계를 보완해 줍니다.C++의 내장 리터럴C++는 다양한 기본 타입에 대해 리터럴을 제공하지만, 그 종류는 제한적입니다.31 — 정수(Integer)3.5 — 배정밀도 실수(Double)4.2F — 부동소수점(Float)p — 문자(Character)31ULL — 부호 없는 long long(Unsigned Long Long)0xD0
문제 개요 하나의 행렬(matrix)이 주어졌을 때, 반복적(iterative) 접근 방식을 사용하여 이를 2차원 연결 리스트로 변환해야 합니다. 이 리스트의 각 노드는 right(오른쪽)와 down(아래쪽) 두 개의 포인터를 가지며, 행렬의 구조를 그대로 유지합니다. 예를 들어, 입력 행렬이 다음과 같다고 가정해 보겠습니다. 102030405060708090 이 행렬을 2D 연결 리스트로 변환하면, 같은 행에 있는 노드들은 right 포인터로, 같은 열에 있는 노드들은 down 포인터로 연결됩니다. 즉, 10 → 20 → 30은
개요하나의 행렬(matrix)이 주어졌을 때, 재귀(recursion) 기법을 활용하여 이를 2차원 연결 리스트(2D Linked List)로 변환하는 방법을 알아보겠습니다.변환된 리스트의 각 노드는 right(오른쪽)와 down(아래) 두 개의 포인터를 가지며, 이를 통해 원본 행렬의 구조를 그대로 유지할 수 있습니다.예를 들어 입력 행렬이 다음과 같다면,102030405060708090변환 결과인 2차원 연결 리스트는 다음과 같은 구조를 갖습니다.알고리즘 접근 방법이 문제는 다음 단계에 따라 해결할 수 있습니다.make_2d_l
문제 개요균형 잡힌 이진 탐색 트리(BST)와 목표 합(target sum)이 주어졌을 때, 두 노드 값의 합이 목표 합과 일치하는 쌍(pair)이 존재하는지 확인하는 메서드를 구현해야 합니다. 이때 트리는 불변(immutable)이라는 점, 즉 트리의 구조나 값을 변경할 수 없다는 조건을 반드시 기억해야 합니다.예를 들어 다음과 같은 트리가 입력으로 주어진다고 가정해 보겠습니다.이 경우 출력 결과는 (9 + 26 = 35)가 됩니다.해결 접근 방법이 문제는 BST의 순회 특성을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디
문제 개요원소들의 집합이 주어졌을 때, 어떤 순열(permutation)이 병합 정렬(Merge Sort)의 최악의 경우(worst case)를 만들어내는지 찾는 문제입니다. 병합 정렬은 점근적으로 항상 O(n log n)의 시간 복잡도를 가지지만, 입력 배열의 배치에 따라 필요한 비교 횟수가 달라지므로 실제 수행 시간에는 차이가 발생합니다. 따라서 일반적인 병합 정렬 알고리즘으로 정렬할 때 가장 많은 비교 연산을 요구하는 입력 순열을 생성해야 합니다.예를 들어 입력이 [11,12,13,14,15,16,17,18,19,20,21,2
문제 소개원소가 모두 0부터 N-1 범위 안에 있는 크기 N의 배열이 주어집니다. 배열은 정렬되어 있지 않으며, 우리의 목표는 이 배열을 여러 개의 파티션(구간)으로 나눈 뒤 각 파티션을 개별적으로 정렬하고 다시 이어 붙였을 때 전체가 정렬된 배열이 되도록 만들 수 있는 파티션의 최대 개수를 구하는 것입니다.각 파티션은 내부 원소들이 정렬되어 있지 않은 상태로 선택됩니다. 0부터 N-1까지의 숫자로 이루어진 배열이 정렬된 상태라면 각 원소는 자신의 값과 동일한 인덱스에 위치하게 됩니다. 즉, Arr[i] = i가 성립합니다.이 문제
다섯 개의 정수 N, A, B, X, Y가 주어졌을 때, 1부터 N까지의 범위에 있는 숫자들을 검사하여 이익을 최대화하는 것이 목표입니다.숫자가 A로 나누어 떨어지면 이익이 X만큼 증가합니다.숫자가 B로 나누어 떨어지면 이익이 Y만큼 증가합니다.단, 범위 내의 각 숫자에 대해서는 이익이 한 번만 추가될 수 있습니다. 만약 어떤 숫자가 A와 B 모두로 나누어 떨어진다면, X와 Y 중 더 큰 값을 선택하는 것이 유리합니다.예제로 이해하기예제 1입력: N=4, A=2, B=3, X=2, Y=3출력: 최대 이익 = 7설명:2와 4는 A(2
문제 개요숫자로 이루어진 배열이 주어졌을 때, 해당 배열 안에 포함된 소수(Prime Number)의 개수를 구하는 것이 목표입니다.소수란 1과 자기 자신으로만 나누어 떨어지는 수, 즉 약수가 정확히 두 개뿐인 자연수를 말합니다. 따라서 배열의 첫 번째 요소부터 마지막 요소까지 차례대로 각 숫자가 소수인지 검사하고, 소수를 발견할 때마다 카운트를 1씩 증가시키면 됩니다.소수 판별 원리숫자 N이 소수인지 확인하려면 2부터 N/2까지 범위의 수 중에서 N을 나누어 떨어지게 하는 수가 존재하는지 검사합니다. 나누어 떨어지는 수가 하나라도
문제 개요크기가 N인 정수 배열이 주어졌을 때, 변수 L과 R은 1부터 N 사이의 범위를 정의합니다(L ≥ 1, R ≤ N). 이 문제의 목표는 범위 [L, R] 안에 포함된 요소들 중 최솟값이 몇 번 등장하는지 그 개수를 구하는 것입니다.해결 접근 방식먼저 L부터 R까지 범위에 속한 요소들을 한 번 순회하면서 가장 작은 값을 찾습니다.같은 범위를 다시 순회하면서 앞서 구한 최솟값과 동일한 요소가 나타날 때마다 카운트를 증가시킵니다.구체적인 예제를 통해 살펴보겠습니다.입력 − arr[] = { 1,2,3,0,3,2,0,1 }, N
직사각형 속 정사각형 개수 구하기 길이 L과 너비 B(단, L ≥ B)를 가진 직사각형이 주어졌을 때, 이 직사각형 L×B 안에 총 몇 개의 정사각형이 포함될 수 있는지 구하는 것이 목표입니다. 예를 들어 3×2 크기의 직사각형에는 2×2 정사각형 2개와 1×1 정사각형 6개가 들어갑니다. 총 정사각형 개수 = 6 + 2 = 8 규칙 찾기 크기 L×B의 모든 직사각형에는 L×B개의 1×1 정사각형이 존재합니다. 만들 수 있는 가장 큰 정사각형의 크기는 B×B입니다. L=B=1일 때: 정사각형 수 = 1 L=B=2일 때: 1 + 4
이 문제에서는 삼각형의 둘레 P가 주어집니다. 둘레란 삼각형 세 변의 길이를 모두 더한 값입니다. 목표는 이 둘레와 동일한 둘레를 가지면서 만들 수 있는 직각삼각형의 총 개수를 찾는 것입니다.삼각형의 세 변을 a, b, c라고 하면 다음 두 조건을 만족해야 합니다.a + b + c = P (둘레 조건)a² + b² = c² (피타고라스 정리, a, b, c의 어떤 조합에도 적용)확인 방법은 a를 1부터 p/2까지, b를 a+1부터 p/3까지 순회하며 c = p − a − b (a + b + c = p)로 계산하는 것입니다.모든 직각
정수 n과 p가 주어졌을 때, 방정식 x² ≡ 1 (mod p)을 만족하는 해의 개수를 구하는 것이 목표입니다. 단, 해 x는 [1, N] 범위 안에 있어야 합니다.가장 직관적인 방법은 1부터 N까지 모든 수를 하나씩 확인하는 것입니다. 각 수 x에 대해 (x × x) % p == 1이 성립하는지 검사하고, 조건을 만족하면 카운트를 1씩 증가시키면 됩니다.예제로 이해하기입력 예시 1입력 − n = 5, p = 2출력 − 해의 개수: 3설명 − 1부터 5 사이의 범위에서 다음과 같이 계산됩니다.1² = 1 % 2 = 1 → count
문제 소개 하나의 숫자 N이 주어졌을 때, 아래 규칙에 따라 이 숫자를 1로 줄이는 데 필요한 총 단계 수를 구하는 것이 목표입니다. 규칙 1: 숫자가 2의 거듭제곱이면, 그 절반으로 줄입니다. 규칙 2: 2의 거듭제곱이 아니라면, N에서 N보다 작은 가장 가까운 2의 거듭제곱을 뺀 값으로 줄입니다. 먼저 ceil(log2(N))과 floor(log2(N))의 결과가 서로 같은지 비교하여 N이 2의 거듭제곱인지 판별합니다. 두 값이 일치한다면 N은 2의 거듭제곱이므로 N을 절반으로 나누고 연산 횟수를 1 증가시킵니다. 조건이 거
정수 n이 주어졌을 때, 다음 두 조건을 동시에 만족하는 세 수의 쌍(트리플렛)을 찾아 그 개수를 세는 것이 목표입니다.a2 + b2 = c21 ≤ a ≤ b ≤ c ≤ n이 문제는 두 개의 반복문을 사용하여 해결할 수 있습니다. 첫 번째 반복문으로 1 ≤ a ≤ n 범위를, 두 번째 반복문으로 1 ≤ b ≤ n 범위를 순회하면서 c = √(a2 + b2)를 계산합니다. 그런 뒤 두 조건을 모두 만족하는 경우 카운트를 증가시키면 됩니다.예제입력 − N = 5출력 − 트리플렛 개수 − 1설명 −a = 3, b = 4, c = 5일 때
정수 배열 Arr[]와 범위를 정의하는 두 변수 a, b가 주어졌을 때, 세 원소의 합이 이 범위 [a, b] 사이에 속하는 삼중항(triplet)의 개수를 찾는 것이 목표입니다.가장 직관적인 방법은 세 개의 for 루프를 사용하는 것입니다. arr[i]+arr[j]+arr[k] >= a 이면서 arr[i]+arr[j]+arr[k] <= b 조건을 만족하면 카운트를 증가시킵니다. 이때 인덱스는 0 <= i <= n-2, i < j < n-1, j < k < n을 따르며, n은 배열 Arr[
숫자 배열 Arr[]가 주어졌을 때, 곱이 주어진 수 p와 같은 삼중항(triplet)의 개수를 세는 것이 목표입니다. 값이 같더라도 서로 다른 요소로 이루어진 삼중항은 별개로 계산합니다. 예를 들어 배열 [1,2,3,1,2]에서 (1,2,3)과 (3,1,2)는 값은 같지만 사용된 요소가 다르므로 서로 다른 삼중항으로 셉니다.예제로 이해하기입력 − arr[]= { 1,2,3,2,4,1,5 }, p=4출력 − 삼중항 개수: 3설명 −삼중항 1 [ 1,2,3,2,4,1,5 ] → (1,2,2), 곱 = 4 삼중항 2 [ 1,2,3,2,
N개의 요소로 구성된 배열이 주어졌을 때, 목표는 값이 서로 같으면서 인덱스가 다른 쌍 (i, j), 즉 Arr[i] == Arr[j]이고 i != j인 인덱스 쌍의 개수를 찾는 것입니다. 이는 같은 크기의 장갑을 한 짝씩 묶는 상황으로 비유할 수 있습니다. N개의 장갑 중에서 실제로 판매할 수 있는 것은 크기가 맞는 한 쌍뿐입니다.이 문제는 두 개의 반복문을 사용하여 해결할 수 있습니다. 바깥쪽 반복문은 0 <= i < n-1 범위에서, 안쪽 반복문은 i < j < n 범위에서 실행합니다. 각 쌍 (i, j)
문제 소개 코딩 대회에 N명의 참가자가 있다고 가정해 보겠습니다. 우리의 목표는 각 사람이 최대 한 명과만 짝을 이룰 수 있을 때, 가능한 짝 조합의 수를 구하는 것입니다. 하나의 짝은 최대 2명으로 구성되며, 참가자가 누구와도 짝을 맺지 않고 혼자 참여하는 경우도 허용됩니다. 이 문제는 다음과 같은 점화식(재귀 관계)을 통해 해결할 수 있습니다. n = 0 또는 n = 1일 때: count = 1 (남은 사람이 없거나 한 명뿐이므로 혼자 남는 방법 하나뿐) 어떤 사람이 혼자 남기로 선택한 경우: 문제의 크기가 n-1로 줄어듭니다
범위 [l, r]과 정수 k가 주어졌을 때, l부터 r 사이(l ≤ 숫자 ≤ r)에 있는 숫자 중에서 그 숫자를 뒤집은 값과 원래 숫자의 차이가 k의 배수가 되는 모든 숫자를 찾는 것이 목표입니다.이 조건을 확인하려면 l부터 r까지 각 숫자를 순회하면서 해당 숫자의 뒤집은 값을 계산합니다. 그다음 뒤집은 값에서 원래 숫자를 뺀 절댓값이 k로 나누어떨어지는지(|차이| % k == 0) 검사하고, 만족한다면 카운트를 증가시킵니다.예제를 통해 자세히 이해해 보겠습니다.입력 − L=21, R=25, K=6출력 − 조건을 만족하는 숫자 개수