이번 글에서는 흥미로운 문제 하나를 살펴보겠습니다. 어떤 숫자가 주어졌을 때 이 숫자를 1만큼 증가시키는 것은 아주 간단한 작업입니다. 하지만 여기서는 숫자를 일반적인 정수 변수가 아니라 배열 형태로 다룹니다. 숫자의 각 자릿수가 배열의 요소 하나하나에 저장되며, 예를 들어 512라면 {5, 1, 2}처럼 저장됩니다.또한 단순 반복문 대신 재귀(recursion) 방식을 사용해 숫자를 증가시켜야 한다는 조건이 있습니다. 자릿수별로 올림(carry)이 발생하는 상황도 재귀 호출로 자연스럽게 처리할 수 있습니다. 그럼 알고리즘부터 차근
이번 글에서는 주어진 문자열의 영숫자 약어(alphanumeric abbreviation)와 관련된 흥미로운 문제를 살펴보겠습니다. 문자열의 길이는 10 미만이라고 가정하며, 생성 가능한 모든 영숫자 약어를 출력하는 것이 목표입니다.영숫자 약어란 문자와 숫자가 섞여 있는 형태를 말합니다. 이때 숫자의 값은 해당 위치에서 생략(건너뛴)된 문자의 개수를 의미합니다. 생략되는 부분 문자열은 여러 곳에 존재할 수 있지만, 두 생략 구간이 서로 인접할 수는 없습니다. 인접하게 되면 하나의 더 큰 숫자로 합쳐져야 하기 때문입니다. 그럼 문제를
이 글에서는 3차원 공간에 존재하는 두 평면 사이의 각도를 계산하는 방법을 살펴보겠습니다. 두 개의 평면 P1과 P2가 있으며, 각 평면의 방정식은 다음과 같은 형태로 표현됩니다.평면의 방정식P1: a1x + b1y + c1z + d1 = 0P2: a2x + b2y + c2z + d2 = 0두 평면 사이의 각도는 각 평면의 법선 벡터(normal vector)를 이용해 구할 수 있습니다. 법선 벡터는 평면 방정식의 계수 (a, b, c)로 나타내며, 두 벡터 사이의 코사인 값을 계산하면 됩니다.각도 계산 공식두 평면 사이의 각도를
이 글에서는 육각형에 내접하는 원 안에 다시 정사각형이 내접해 있는 경우, 그 정사각형의 넓이를 구하는 방법을 알아보겠습니다.여기서 각 변수는 다음과 같이 정의됩니다.정사각형의 한 변의 길이: a원의 반지름: r육각형의 한 변의 길이: A수식 유도 과정1단계: 육각형에 내접하는 원의 반지름한 변의 길이가 A인 정육각형에 내접하는 원의 반지름은 다음 공식으로 구할 수 있습니다.r = (√3 / 2) × A정육각형은 6개의 정삼각형으로 나눌 수 있고, 내접원의 반지름은 정삼각형의 높이와 같기 때문에 위와 같은 공식이 성립합니다.2단계:
이 글에서는 정삼각형에 내접하는 원 안에 다시 내접하는 정사각형의 넓이를 구하는 방법을 다룹니다. 수학적 유도 과정과 함께 이를 계산하는 C++ 프로그램까지 단계별로 살펴보겠습니다.문제 정의기하학적 관계를 정리하면 다음과 같습니다.정삼각형의 한 변의 길이: A정삼각형에 내접하는 원의 반지름: r원에 내접하는 정사각형의 한 변의 길이: a수식 유도1단계: 원의 반지름 구하기정삼각형에 내접하는 원의 반지름은 곧 삼각형의 내접원 반지름(inradius)입니다. 한 변의 길이가 A인 정삼각형의 내접원 반지름은 다음 공식으로 구할 수 있습니
이번 글에서는 타원에 내접하는 직사각형 안에 다시 내접한 삼각형의 넓이를 구하는 방법을 살펴보겠습니다. 타원의 장반경(장축의 절반)은 a, 단반경(단축의 절반)은 b라고 가정합니다. 수학적 원리 타원 x²/a² + y²/b² = 1에 내접할 수 있는 직사각형 중 넓이가 가장 커지는 경우는, 직사각형의 꼭짓점들이 좌표 (±a/√2, ±b/√2)에 위치할 때입니다. 이때 직사각형의 최대 넓이는 다음과 같습니다. 직사각형의 최대 넓이 = 2ab 그리고 이 직사각형 안에 형성되는 삼각형은 직사각형 전체 넓이의 정확히 절반을 차지합니다.
이 글에서는 마름모 안에 내접하는 원의 넓이를 구하는 방법을 알아보겠습니다. 마름모의 두 대각선의 길이가 각각 a와 b로 주어졌을 때, 내접하는 원의 반지름을 h라고 합니다.공식 유도 과정마름모의 두 대각선은 서로 수직으로 교차하며, 이 교차점을 기준으로 마름모는 네 개의 합동인 직각삼각형으로 나뉩니다. 각 직각삼각형의 두 변(밑변과 높이)은 대각선의 절반, 즉 a/2와 b/2가 되므로, 각 삼각형의 넓이는 다음과 같습니다.삼각형의 넓이 = (1/2) × (a/2) × (b/2) = ab / 8한편, 마름모의 한 변은 직각삼각형의
이번 글에서는 정삼각형 안에 내접하는 원의 넓이를 구하는 방법을 알아보겠습니다. 삼각형의 한 변의 길이를 a라고 가정합니다.수학적 접근 방법먼저 정삼각형의 넓이 공식은 다음과 같습니다.정삼각형의 넓이 = (√3 / 4) × a²다음으로 삼각형의 반둘레(semi-perimeter)는 세 변의 합을 2로 나눈 값입니다.반둘레(s) = 3a / 2삼각형에 내접하는 원(내접원)의 반지름은 삼각형의 넓이를 반둘레로 나눈 값과 같다는 성질을 이용하면 다음과 같이 계산할 수 있습니다.r = 넓이 / 반둘레 = [(√3 / 4) × a²] ÷ (
이번 글에서는 직각삼각형의 외접원(circumcircle) 넓이를 구하는 방법을 살펴보겠습니다.직각삼각형의 중요한 기하학적 성질 중 하나는, 세 꼭짓점을 모두 지나는 원(외접원)의 지름이 바로 빗변(hypotenuse)이라는 점입니다. 탈레스 정리에 따르면 직각의 크기가 원주각의 2배인 중심각에 해당하기 때문에, 빗변은 항상 원의 지름과 일치하게 됩니다.따라서 빗변의 길이를 h라고 하면, 외접원의 반지름 r은 h/2가 됩니다.넓이 공식원의 넓이 공식 A = π × r² 에 반지름 h/2를 대입하면 다음과 같이 정리할 수 있습니다.A
이 글에서는 원 안에 내접하는 정십각형(decagon)의 넓이를 구하는 방법을 살펴봅니다. 원의 반지름 r이 주어졌을 때, 그 원에 내접하는 정십각형의 넓이를 계산하는 것이 목표입니다. 기하학적 원리 반지름이 r인 원에 정십각형이 내접해 있다고 가정해 보겠습니다. 원의 중심과 정십각형의 인접한 두 꼭짓점을 연결하면 10개의 동일한 삼각형이 만들어지며, 각 삼각형의 중심각은 360° ÷ 10 = 36°입니다. 이 삼각형의 성질을 이용하면 정십각형의 한 변의 길이 a를 다음과 같이 구할 수 있습니다. a = 2r·sin(18°) = r
개요이번 글에서는 대각선 길이만 주어졌을 때 정육각형(정6각형)의 넓이를 계산하는 방법을 알아봅니다. 여기서 대각선 길이는 d로 표기합니다.넓이 공식의 원리정육각형은 여섯 개의 변과 각이 모두 같은 도형입니다. 정육각형의 각 내각은 모두 120°이며, 내각의 합은 720°입니다.대각선 길이가 d일 때, 정육각형의 넓이는 다음 공식으로 구할 수 있습니다.A = (3√3 × d²) / 8이 공식은 정육각형을 여섯 개의 정삼각형으로 나누고, 대각선이 두 개의 정삼각형 변에 해당한다는 사실을 이용해 유도할 수 있습니다.C++ 구현 예제#i
이번 글에서는 N변 정다각형에 내접하는 가장 큰 원, 즉 내접원의 면적을 구하는 방법을 알아보겠습니다. 여기서 다각형의 변의 개수 N과 한 변의 길이 a가 주어졌다고 가정합니다.내접원 면적의 계산 원리접근 방식은 생각보다 간단합니다. 정다각형은 중심을 기준으로 N개의 합동인 삼각형으로 나눌 수 있으며, 이때 각 삼각형이 중심에서 이루는 각도는 360°/N입니다.삼각형 하나를 살펴보면, 밑변은 다각형의 한 변의 길이 a이고, 꼭짓점에서 밑변까지 내린 수선의 길이가 곧 내접원의 반지름 r이 됩니다. 삼각형을 반으로 나눈 직각삼각형에서
하나의 직사각형이 주어졌다고 가정해 봅시다. 이 직사각형의 가로 길이 L과 세로 길이 B를 알고 있을 때, 그 직사각형 안에 내접할 수 있는 가장 큰 삼각형의 넓이를 구하는 방법을 알아보겠습니다.핵심 아이디어직사각형 안에 그릴 수 있는 가장 큰 삼각형은 항상 직사각형 넓이의 정확히 절반이 됩니다. 삼각형의 밑변을 직사각형의 한 변 전체 길이로 하고, 꼭짓점을 반대편 변 위에 두면 높이가 나머지 한 변의 길이와 같아지기 때문입니다.따라서 최대 삼각형의 넓이는 다음 공식으로 구할 수 있습니다.넓이 = (L × B) / 2C++ 코드 예
문제 개요 한 변의 길이가 a인 정사각형이 하나 있다고 가정해 봅시다. 이 정사각형의 네 변에서 중점들을 찾아 서로 연결하면 그 안에 새로운 정사각형이 만들어집니다. 같은 방식으로 중점을 연결하는 작업을 n번 반복했을 때, n번째 정사각형의 넓이를 구하는 것이 이 글의 목표입니다. 풀이 접근 바깥쪽 첫 번째 정사각형의 한 변의 길이가 a이므로, 그 넓이는 다음과 같습니다. A1 = a2 이제 피타고라스 정리를 활용해 보겠습니다. 각 변의 중점을 연결해 만든 두 번째 정사각형의 한 변은, 원래 정사각형의 한 변과 절반 지점을 잇는
이번 글에서는 하나의 직사각형이 주어졌을 때, 그 직사각형 안에 내접할 수 있는 가장 큰 마름모의 넓이를 구하는 방법을 알아보겠습니다. 도형의 모습은 아래 그림과 같습니다.마름모 넓이 공식직사각형의 가로 길이를 l, 세로 길이를 b라고 할 때, 직사각형에 내접하는 가장 큰 마름모의 두 대각선 길이는 각각 직사각형의 가로와 세로와 같습니다. 마름모의 넓이는 두 대각선의 곱을 2로 나눈 값이므로, 구하고자 하는 마름모의 넓이는 다음과 같습니다.마름모의 넓이 = (l × b) / 2즉, 직사각형에 내접할 수 있는 가장 큰 마름모의 넓이는
이 글에서는 흥미로운 문제 하나를 살펴보겠습니다. N개의 요소로 구성된 배열이 주어졌을 때, 다음과 같은 형식의 쿼리 Q를 처리해야 합니다.Q(start, end) — start부터 end까지의 구간에서 어떤 수 p가 정확히 p번 등장하는 경우의 개수를 구합니다.문제 이해하기배열이 {1, 5, 2, 3, 1, 3, 5, 7, 3, 9, 8}과 같다고 가정하고, 몇 가지 쿼리를 확인해 보겠습니다.Q(1, 8) — 해당 구간에서 1은 한 번, 3은 세 번 등장합니다. 즉 값과 빈도가 일치하는 수는 1과 3 두 개이므로 답은 2입니다.Q
재귀 함수 호출에 필요한 보조 공간이란?이 글에서는 재귀 함수 호출 시 필요한 보조 공간(auxiliary space)이 얼마나 되는지 살펴보고, 일반적인 함수 호출과 어떻게 다른지 비교해 보겠습니다.재귀 함수 예시다음과 같은 팩토리얼 함수가 있다고 가정해 봅시다.long fact(int n){ if(n == 0 || n == 1) return 1; return n *
이 글에서는 바움-스위트 수열(Baum–Sweet Sequence)의 개념과 이를 C++로 구현하는 방법을 살펴봅니다. 바움-스위트 수열은 0과 1로만 이루어진 이진 수열로, 자연수 n을 이진수로 나타냈을 때 연속된 0이 홀수 개 포함되어 있으면 n번째 항은 0, 그렇지 않으면 1이 됩니다. 바움-스위트 수열의 정의 자연수 n이 주어졌을 때, 바움-스위트 수열의 n번째 항을 구하는 것이 목표입니다. 이를 위해서는 n의 이진 표현에서 길이가 홀수인 연속된 0 블록이 존재하는지 확인해야 합니다. 예를 들어 n = 4라고 가정해 보겠습니
약혼수(Betrothed Number)란? 약혼수(Betrothed Number)는 수론에서 다루는 흥미로운 개념으로, 한 수의 진약수(자기 자신을 제외한 약수)의 합이 상대 수보다 정확히 1만큼 큰 두 수의 쌍을 가리킵니다. 조건을 식으로 표현하면 다음과 같습니다. A의 진약수의 합 = B + 1 B의 진약수의 합 = A + 1 가장 잘 알려진 예시는 (48, 75)입니다. 48의 진약수: {1, 2, 3, 4, 6, 8, 12, 16, 24} → 합계 76 (= 75 + 1) 75의 진약수: {1, 3, 5, 15, 25}
CLRS(『Introduction to Algorithms』) 교재에서는 너비 우선 탐색(BFS, Breadth-First Search) 알고리즘을 벡터(vector)와 큐(queue)를 사용해 설명합니다. 이 글에서는 해당 알고리즘을 C++ STL을 활용해 직접 구현해 보겠습니다. 먼저 의사코드 형태의 알고리즘을 살펴본 뒤, 실제로 동작하는 C++ 코드와 실행 결과까지 확인하겠습니다. BFS 알고리즘 (CLRS) BFS는 시작 정점 s에서 출발해 시작점에 가까운 정점부터 차례대로 넓게 탐색하는 그래프 순회 기법입니다. 각 정점