개요이 글에서는 이진 탐색(binary search)을 활용하여 주어진 그래프의 최소 정점 커버(minimum vertex cover) 크기를 구하는 C++ 프로그램을 살펴보겠습니다.최소 정점 커버란 그래프의 모든 간선이 해당 집합에 포함된 정점 중 적어도 하나와 연결(인접)되도록 만드는 정점들의 집합입니다. 쉽게 말해, 그래프의 모든 간선을 덮을 수 있는 가장 작은 크기의 정점 집합이라고 할 수 있습니다.예를 들어 다음과 같은 그래프가 있다고 가정해 보겠습니다.2 ---- 4 ---- 6 | | | | |
이 글에서는 주어진 숫자의 각 자릿수를 반복해서 더하여, 그 결과가 한 자리 숫자가 될 때까지 계산하는 C++ 프로그램을 다룹니다. 이렇게 얻어진 최종 한 자리 숫자는 수학에서 디지털 루트(digital root)라고도 불립니다.문제 이해하기예를 들어 숫자 14520을 살펴보겠습니다. 먼저 각 자릿수를 더하면 다음과 같습니다.1 + 4 + 5 + 2 + 0 = 1212는 아직 두 자리 숫자이므로, 한 번 더 자릿수를 더해야 합니다.1 + 2 = 33은 한 자리 숫자이므로 더 이상 자릿수를 더할 수 없으며, 이것이 최종 답이 됩니다.
개요이 글에서는 주어진 점을 포함하는 가장 적합한(best fit) 직사각형을 찾는 프로그램을 C++로 구현하는 방법을 살펴보겠습니다.문제 정의점의 좌표 (x, y)와 가로세로 비율 l/b가 주어졌을 때, 다음 조건을 모두 만족하는 직사각형의 좌표를 구해야 합니다.주어진 점 (x, y)를 반드시 포함해야 합니다.직사각형의 가로와 세로 길이가 주어진 비율 l : b를 따라야 합니다.조건을 만족하는 직사각형이 여러 개 존재한다면, 직사각형의 중심과 주어진 점 사이의 유클리드 거리가 가장 짧은 것을 선택합니다.접근 방법이 문제는 다음 단
이 글에서는 주어진 배열의 모든 원소를 곱한 값에서 첫 번째 자리 숫자(가장 앞자리 숫자)를 구하는 프로그램을 살펴보겠습니다. 예를 들어, 다음과 같은 배열이 주어졌다고 가정해 봅시다. arr = {12, 5, 16} 배열의 원소들을 모두 곱하면 12 × 5 × 16 = 960이 됩니다. 따라서 곱의 결과인 960에서 첫 번째 자리 숫자는 9입니다. 알고리즘 접근 방식 이 문제는 크게 두 단계로 나누어 해결할 수 있습니다. 1단계: 반복문을 사용해 배열의 모든 원소를 하나씩 곱하여 전체 곱(prod)을 계산합니다.2단계: 계산된 곱
이 글에서는 평면 위에 놓인 가로(수평) 선분과 세로(수직) 선분들이 서로 교차하며 생기는 교점들을 연결할 때, 만들 수 있는 삼각형의 총 개수를 구하는 C++ 프로그램을 소개합니다.예를 들어 아래 그림과 같은 선분들이 주어졌다고 가정해 보겠습니다. 이 선분들은 총 3개의 교점을 형성하며, 3개의 점으로 만들 수 있는 삼각형의 개수는 조합 공식에 따라 3C3 = 1가지입니다. | ---|--------|-- | | | --|---| | |접근 방식: 스윕 라인(Sweep Line) 알
이 글에서는 주어진 숫자 N의 패리티(parity)를 구하는 C++ 프로그램을 살펴보겠습니다.패리티란 무엇인가?패리티는 숫자의 이진수 표현에서 설정된 비트(set bit), 즉 1의 개수를 의미합니다.이진수 표현에서 1의 개수가 짝수이면 짝수 패리티(Even Parity)이진수 표현에서 1의 개수가 홀수이면 홀수 패리티(Odd Parity)알고리즘: XOR 폴딩 기법주어진 숫자가 N일 때, 다음과 같은 연산을 순서대로 수행합니다.y = N ^ (N >> 1)y = y ^ (y >> 2)y = y ^ (y >
개요이 글에서는 마르코프 체인(Markov Chain)에서 초기 상태에서 최종 상태까지 주어진 시간 안에 도달할 확률을 계산하는 C++ 프로그램을 살펴봅니다.마르코프 체인은 여러 개의 상태(state)와 한 상태에서 다른 상태로 이동할 확률들로 구성된 무작위 프로세스입니다. 한 상태에서 다른 상태로 이동하는 데에는 단위 시간이 소요됩니다.접근 방법마르코프 체인은 유향 그래프(directed graph)로 표현할 수 있습니다. 문제를 해결하려면 주어진 마르코프 체인을 전이 행렬(transition matrix) 형태로 변환하면 됩니다
이 글에서는 포물선 방정식의 계수 a, b, c가 주어졌을 때, 해당 포물선의 꼭짓점(Vertex), 초점(Focus), 그리고 준선(Directrix)을 구하는 C++ 프로그램을 다룹니다.포물선이란?포물선은 곡선 위의 모든 점이 하나의 고정된 점, 즉 초점으로부터 등거리에 있는 위치에 있는 곡선입니다. 물체의 포물선 운동, 반사경의 설계 등 다양한 분야에서 활용되는 중요한 곡선입니다.포물선의 일반 방정식과 공식포물선의 일반적인 방정식은 다음과 같습니다.y = ax2 + bx + c이 방정식에서 꼭짓점, 초점, 준선은 각각 아래 공
이 글에서는 주어진 모든 좌표 점을 단 두 개의 평행선만으로 표현할 수 있는지 확인하는 C++ 프로그램을 살펴보겠습니다. 문제 이해하기 정수 배열이 하나 주어지며, 각 좌표는 (i, arr[i]) 형태로 정의됩니다. 예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다. arr = {2,6,8,12,14} 이 경우 점들은 두 개의 평행선에 배치할 수 있습니다. 첫 번째 선에는 (1,2), (3,8), (5,14)가 속하고, 두 번째 선에는 나머지 좌표인 (2,6), (4,12)가 속합니다. 접근 방법 이 문제는 직선의 기울기(sl
이 글에서는 주어진 행렬(matrix) 안에서 두 셀 사이에 경로가 존재하는지 확인하는 C++ 프로그램을 살펴보겠습니다.문제 정의0, 1, 2, 3의 값을 가질 수 있는 4×4 정사각형 행렬이 주어졌다고 가정해 봅시다. 각 숫자의 의미는 다음과 같습니다.0: 빈 벽 (이동 불가)1: 출발점(Source)2: 도착점(Destination)3: 빈 셀 (자유롭게 이동 가능)행렬에는 출발점과 도착점이 각각 하나씩만 존재합니다. 프로그램은 상하좌우 네 방향으로만 이동할 수 있다고 가정하고(대각선 이동은 허용되지 않음), 출발점에서 도착점까
배열로 표현되는 숫자란, 숫자의 각 자릿수를 배열의 개별 요소 하나씩에 나누어 저장하는 방식을 말합니다. 배열의 길이는 숫자의 자릿수와 같습니다. 예를 들어 네 자리 숫자라면 배열의 길이는 4가 됩니다. 배열의 모든 요소는 반드시 한 자리 숫자(0~9)여야 하며, 마지막 요소에는 가장 작은 자릿수(일의 자리)가, 첫 번째 요소에는 가장 큰 자릿수(최상위 자릿수)가 저장됩니다.배열 표현 방식의 예숫자 351932는 다음과 같이 저장됩니다.{3, 5, 1, 9, 3, 2}1을 더하는 알고리즘의 동작 원리배열로 표현된 숫자에 1을 더하려
배열(array)은 같은 데이터 타입의 여러 요소를 하나의 컨테이너에 저장하는 자료구조입니다. 배열의 인덱스는 0부터 시작하며, 즉 첫 번째 요소의 인덱스는 0입니다.이 문제에서는 배열에서 짝수 인덱스에 위치한 숫자들과 홀수 인덱스에 위치한 숫자들을 각각 묶어 두 그룹의 절대 차이를 구해야 합니다.짝수 인덱스: 0, 2, 4, 6, 8 …홀수 인덱스: 1, 3, 5, 7, 9 …여기서 절대 차이(absolute difference)란 두 값의 차이에 절댓값을 취한 것으로, 항상 양수가 됩니다.예를 들어 15와 7의 절대 차이는 |1
호(Arc)란 무엇인가?각도(Angle)는 두 개의 반직선이 한 점에서 만나면서 형성됩니다. 이때 평면 위에서 반직선들이 만나는 지점을 꼭짓점(vertex)이라고 합니다.원의 호(Arc)는 특정 각도에 의해 결정되는 원주(circumference)의 일부분을 의미합니다.이 문제에서는 원의 각도가 주어지며, 원의 지름을 이용해 해당 호의 길이를 구해야 합니다.예시입력 : 각도 = 45° 지름 = 28 출력 : 호의 길이 = 11호 길이 공식호의 길이는 다음과 같은 공식으로 계산할 수 있습니다.호의 길이 = 원주 × (각도 / 360°
이진 트리의 반시계 방향 나선형 순회(Anti-Clockwise Spiral Traversal)란 트리의 노드들을 나선 모양으로 방문하되, 일반적인 시계 방향과는 반대 순서로 탐색하는 기법입니다. 즉, 최상위 레벨부터 시작해 레벨을 번갈아 가며 오른쪽→왼쪽, 왼쪽→오른쪽 방향을 교차하며 노드를 출력합니다.반시계 방향 나선형 순회의 동작 원리아래 그림은 이진 트리가 반시계 방향 나선형으로 순회되는 과정을 보여줍니다.알고리즘 설명나선형 순회를 위한 알고리즘은 다음과 같은 방식으로 동작합니다.두 개의 변수 i와 j를 선언하고, 각각 i
배열(Array)은 같은 자료형의 요소들을 모아 놓은 집합입니다. 그중 정렬된 배열(sorted array)은 요소들이 오름차순 또는 내림차순으로 저장되어 있는 배열을 의미합니다.고유 개수(distinct count)란 서로 다른 값의 개수를 뜻하며, 절댓값 고유 개수(absolute distinct count)는 각 요소에 절댓값(부호를 제거한 값)을 적용했을 때 서로 다른 값이 몇 개인지 세는 것입니다.이번 글에서는 정렬된 배열에서 절댓값 고유 개수를 구하는 프로그램을 작성해 보겠습니다. 즉, 배열의 각 요소에 절댓값을 취했을
C++ STL에서 c_str() 함수는 널 문자(null character)로 종료되는 문자 배열에 대한 포인터를 반환하는 내장(built-in) 메서드입니다. 이 함수가 반환하는 값은 널 문자로 끝나는 C 스타일 문자열입니다.함수 문법C++에서 c_str 함수를 정의하는 문법은 다음과 같습니다.const char* c_str() const함수의 특징c_str()은 C++ STL 라이브러리의 string 클래스에 포함된 내장 메서드로, 다음과 같은 특징을 가집니다.매개변수를 전달받지 않습니다.반환 타입은 char 포인터(const
C++의 set(집합)은 값을 저장하는 대표적인 연관 컨테이너입니다. set의 가장 큰 특징은 다음 두 가지입니다.중복을 허용하지 않음 — 모든 요소는 서로 다른 고유한 값만 가집니다.자동 정렬 — 요소들은 항상 오름차순으로 저장됩니다.일반적으로 set에는 int, string 같은 기본 타입을 사용하지만, C++에서는 사용자가 직접 정의한 데이터 타입(struct, class 등)도 set의 요소로 사용할 수 있습니다. 이때 비교 연산자를 직접 정의해 주어야 합니다.예를 들어, 임의의 순서로 입력된 중복 값을 포함한 데이터를 se
주어진 반지름 r을 가진 원과 2차원 평면 위의 여러 점들이 있을 때, 그 원이 품을 수 있는 최대 점 개수를 찾는 것이 이 글의 핵심 문제입니다. 여기서 포함된다는 것은 점이 원의 경계선이 아니라 원의 내부에 위치한다는 의미입니다.이 문제를 해결하는 가장 효율적인 방법 중 하나가 바로 각도 스윕(Angular Sweep) 알고리즘입니다.알고리즘 동작 원리문제에 주어진 n개의 점에 대해 서로 다른 두 점으로 만들 수 있는 모든 쌍(nC2) 사이의 거리를 미리 계산해 둡니다.임의의 한 점 P를 기준점으로 선택합니다. 어떤 점 j가 반
C++ 표준 템플릿 라이브러리(STL)에는 bitset이라는 독특한 컨테이너가 정의되어 있습니다. bitset은 이름 그대로 데이터를 비트(bit) 단위로 다루기 위한 컨테이너로, 변수를 구성하는 개별 비트, 즉 주어진 값의 이진수 표현을 직접 조작하고 관리할 때 매우 유용합니다.1. bitset은 문자열처럼 다룰 수 있다bitset은 오직 0과 1만 유효한 값으로 가지는 비트들의 집합입니다. 재미있는 점은 문자열과 비슷한 방식으로 특정 구간만 잘라내어 새로운 bitset을 만들 수 있다는 것입니다. 시작 인덱스와 원소 개수를 지정
벨만-포드(Bellman-Ford) 알고리즘은 동적 계획법(Dynamic Programming)에 기반한 최단 경로 알고리즘입니다. 시작 정점(출발점)으로 삼은 하나의 정점에서 출발하여, 그래프에 있는 모든 정점까지의 최단 거리를 반복적인 방식(iterative method)으로 점진적으로 찾아냅니다. 이 알고리즘은 가중치가 부여된 그래프(weighted graph)에 적용할 수 있습니다.알고리즘의 역사이 알고리즘은 1955년 알폰소 시멜(Alphonso Shimbel)에 의해 처음 제안되었습니다. 이후 리처드 벨만(Richard