C++ 그래픽 프로그래밍이란? C++는 매우 유연하고 다재다능한 프로그래밍 언어입니다. C++를 활용하면 기본 도형 그리기, 스타일리시한 글꼴의 텍스트 출력, 색상 입히기 같은 저수준 그래픽 작업도 손쉽게 구현할 수 있습니다. C++에서 그래픽 프로그래밍은 터미널이나 명령 프롬프트 환경에서 바로 진행할 수 있으며, DevC++ 컴파일러를 설치해 개발 환경을 구성하는 방법도 있습니다. 터미널에 graphics.h 라이브러리 설치하기 터미널 환경에서 그래픽 프로그래밍을 하려면 GCC 컴파일러에 graphics.h 라이브러리를 추가해야
관계 대수(Relational Algebra)는 절차적 질의 언어(procedural query language)로, 하나 이상의 릴레이션(관계)에 대해 연산을 수행한 결과를 단일 테이블/릴레이션 형태로 반환하는 데 사용됩니다. 이 글에서는 관계 대수의 기본 연산자들을 예제와 함께 자세히 살펴보겠습니다.설명을 위해 다음 세 개의 릴레이션(테이블)을 사용합니다.테이블 1: course (과목)Course_idName1Computer science2Information Technology3mechanical테이블 2: students
벨 수(Bell Number)는 n개의 원소를 가진 집합을 공집합이 아닌(최소 한 개 이상의 원소를 포함하는) 부분 집합들로 나누는 방법의 총 가짓수를 나타내는 수입니다.이 글에서는 n개의 원소로 이루어진 집합이 주어졌을 때, 이를 빈 집합이 아닌 부분 집합들로 분할하는 모든 경우의 수를 구하는 프로그램을 만들어 보겠습니다.예시입력 : 3 출력 : 5설명 − 세 원소로 이루어진 집합 {1, 2, 3}을 생각해 봅시다.가능한 모든 분할은 다음과 같습니다.{{1}, {2}, {3}} ; {{1}, {2, 3}} ; {{1, 2}, {3
최선 우선 탐색(Best First Search)은 다음에 방문할 노드를 정할 때, 가장 유망해 보이는(promising) 노드를 판단하여 선택하는 그래프 순회(traversal) 기법입니다. 단순히 순서대로 노드를 방문하는 것이 아니라, 평가 함수(evaluation function)를 사용해 각 노드의 비용이나 점수를 계산하고, 가장 좋아 보이는 노드부터 우선적으로 탐색합니다.이처럼 노드를 평가할 때 휴리스틱(heuristic), 즉 경험적 지식을 활용하기 때문에 최선 우선 탐색은 휴리스틱 탐색(heuristic search)
이번 글에서 살펴볼 문제는 0과 1로만 이루어진 2차원 바이너리 배열입니다. 여기서 값 1은 그룹에 속한 사람의 집 위치를 나타냅니다. 그룹원들이 한 곳에 모여 만나려 할 때, 모든 사람이 이동해야 하는 총 거리를 최소화하는 만남의 장소를 찾아야 하며, 만남의 장소는 집이 아닌 위치라면 배열 내 어디든 가능합니다. 격자 위에서의 최소 이동 거리를 계산할 때 널리 사용되는 것이 맨해튼 거리(Manhattan Distance)입니다. 상하좌우 방향으로만 이동할 수 있다고 가정할 때, 두 점 p1과 p2 사이의 거리는 다음과 같이 정의
비연결 그래프(disconnected graph)란 하나 이상의 정점이 다른 정점들과 어떤 경로로도 연결되어 있지 않은 그래프를 말합니다. 즉, 그래프 전체가 여러 개의 연결 요소(connected component)로 나뉘어 있는 경우입니다.위 그림처럼 비연결 그래프에서는 특정 정점에서 출발해도 도달할 수 없는 정점들이 존재합니다.일반 BFS가 동작하지 않는 이유기본적인 BFS(너비 우선 탐색)는 그래프가 연결 그래프, 즉 임의의 한 정점에서 출발했을 때 나머지 모든 정점에 도달할 수 있는 경우에만 올바르게 동작합니다. 시작 정점
문제 개요이 문제에서는 숫자 배열이 주어지고, 특정 조건을 만족하도록 숫자들을 재배열하여 만들 수 있는 가장 큰 수를 찾아야 합니다. 핵심 제약 조건은 짝수끼리의 상대적 순서와 홀수끼리의 상대적 순서는 반드시 유지되어야 한다는 점입니다. 즉, 짝수들의 등장 순서나 홀수들의 등장 순서를 임의로 변경할 수 없습니다.예시를 통해 개념을 더 자세히 살펴보겠습니다.입력 : {17, 80, 99, 27, 14, 22} 출력 : 801799271422 설명 : 짝수와 홀수의 순서는 다음과 같습니다. 짝수 : 80 14 22 홀수 : 17 99
이진 삽입 정렬이란?이진 삽입 정렬(Binary Insertion Sort)은 일반적인 삽입 정렬(Insertion Sort)을 개선한 특수한 형태의 정렬 알고리즘입니다. 배열에서 삽입할 요소가 들어갈 올바른 위치를 찾을 때 이진 탐색(Binary Search) 알고리즘을 활용하는 것이 핵심 특징입니다.삽입 정렬은 각 요소를 배열 내 자신의 올바른 위치에 찾아 넣는 방식으로 동작하는 정렬 기법입니다. 반면 이진 탐색은 배열의 중간 지점부터 비교해 나가며 원하는 값을 찾는 탐색 기법입니다.시간 복잡도 개선이진 탐색의 시간 복잡도는 로
문제 개요 이 문제에서는 하나의 숫자가 이진수 형태로 주어지며, 해당 숫자에 1을 더한 값, 즉 다음 숫자의 이진 표현을 구해야 합니다. 이진 표현(binary representation)이란 숫자의 밑(base)을 2로 변환하여 0과 1만으로 나타내는 방식입니다. 예를 들어, 십진수 14의 이진 표현은 1110입니다. 따라서 이진수 형태의 숫자 n이 주어졌을 때, n+1의 이진 표현을 구하는 것이 이 글의 목표입니다. 이진수 덧셈의 기본 원리 이 문제를 해결하려면 먼저 이진수 덧셈의 기본 규칙을 이해해야 합니다. 이진수에서 0
이번 문제는 하나의 숫자가 이진수 형태로 주어졌을 때, 그 숫자에서 1을 뺀 값, 즉 바로 앞에 있는 숫자의 이진 표현을 구하는 것입니다.숫자의 이진 표현(binary representation)이란 해당 숫자를 2진법으로 변환하여 0과 1만으로 나타내는 것을 의미합니다.예를 들어, 23의 이진 표현은 10111입니다.즉, 이진수 형태의 숫자 n이 주어지면 n-1에 해당하는 이진 표현을 찾아야 하는 것이죠.이진수 뺄셈의 기본 원리이 문제를 해결하려면 먼저 이진수 뺄셈의 기본 개념을 이해해야 합니다. 이진수에서 1을 뺄 때 어떤 일이
이진 탐색(Binary Search)은 정렬된 데이터에서 원하는 값을 빠르게 찾아내는 대표적인 탐색 알고리즘입니다. 문자열 이진 탐색이란, 사전에 정렬된 문자열 배열이 주어졌을 때 이진 탐색 알고리즘을 활용하여 특정 문자열의 위치를 찾는 기법을 말합니다. 예시로 이해하기 입력 : stringArray = {I, Love, Programming, tutorials, point} 찾을 문자열 = Programming 출력 : 인덱스 2에서 문자열 발견 설명 : Programming의 배열 내 위치(인덱스)는 2입니다. 입력 : str
이항 계수란?이항 계수(binomial coefficient)는 c(n,k) 또는 nCk로 표기하며, 이항식 (1+X)n을 전개했을 때 xk 항의 계수로 정의됩니다.또한 이항 계수는 n개의 서로 다른 대상 중에서 k개를 선택하는 경우의 수, 즉 n개 원소로 이루어진 집합의 k-조합(k-combination) 개수를 나타냅니다. 이때 선택 순서는 고려하지 않습니다.이 글에서는 두 개의 매개변수 n과 k가 주어졌을 때, 이항 계수 nCk의 값을 구하는 방법을 알아보겠습니다.예시입력 : n = 8, k = 3 출력 : 56이 문제는 여러
문제 설명 두 개의 정수 a와 b가 주어졌을 때, 밑변이 b이고 넓이가 최소한 a 이상인 삼각형을 만들 수 있는 가장 작은 높이를 구하는 문제입니다. 예시 a = 16, b = 4일 때, 최소 높이는 8입니다. 알고리즘 삼각형의 넓이는 다음 공식으로 계산할 수 있습니다. 넓이 = ½ × 높이 × 밑변 위 공식을 변형하면 높이를 다음과 같이 구할 수 있습니다. 높이 = (2 × 넓이) ÷ 밑변 여기서 구한 값이 정수가 아닐 수 있으므로, 조건(넓이가 최소한 a 이상)을 만족하기 위해서는 결과값에 ceil() 함수를 적용하여 올림 처
문제 설명이진(binary) 문자열이 하나 주어집니다. 이 문자열을 임의의 위치에서 두 부분으로 나누어 왼쪽 부분은 모두 1, 오른쪽 부분은 모두 0이 되도록 만들어야 하며, 이때 필요한 최소 뒤집기(flips) 횟수를 구하는 것이 과제입니다.예시주어진 이진 문자열이 0010101라고 가정해 보겠습니다. 이 문자열에는 1비트가 3개, 0비트가 4개 포함되어 있습니다. 아래와 같이 총 4개의 비트를 뒤집으면 왼쪽은 모두 1, 오른쪽은 모두 0인 형태가 됩니다.0010101뒤집기를 수행한 후의 문자열은 다음과 같습니다.1110000접근
문제 정의서로 순열(permutation) 관계에 있는 n개의 문자열이 주어집니다. 우리는 문자열의 첫 번째 문자를 맨 뒤로 옮기는 연산을 반복하여 모든 문자열을 동일하게 만들어야 하며, 그때 필요한 최소 연산 횟수를 구하는 것이 목표입니다.예시배열이 arr[] = {abcd, cdab}와 같이 주어졌다면, 두 문자열을 같게 만들기 위해 총 2번의 이동이 필요합니다.첫 번째 문자열 abcd에서 문자 a를 맨 뒤로 이동합니다. 연산 후 문자열은 bcda가 됩니다.이어서 문자 b를 맨 뒤로 이동합니다. 연산 후 문자열은 cdab가 되며
문제 정의주어진 문자열의 뒤쪽에 문자를 추가하여 회문(palindrome)을 만들 때, 필요한 최소 추가 문자 개수를 구하는 문제입니다.예시문자열이 abcac라고 가정해 보겠습니다. 뒤에 2개의 문자를 추가하여 abcacba로 만들면 회문이 됩니다. 따라서 정답은 2입니다.알고리즘먼저 문자열이 이미 회문인지 확인합니다. 회문이라면 추가할 문자가 없으므로 0을 반환합니다.회문이 아니라면, 앞에서부터 한 글자씩 제거하면서 남은 문자열이 회문인지 검사합니다.남은 문자열이 회문이 될 때까지 이 과정을 재귀적으로 반복합니다.앞에서 제거한 문
문제 설명물이 담긴 N개의 잔과 각 잔의 용량 목록이 주어집니다. 이때 정확히 K개의 잔을 채우기 위해 필요한 최소 병 개수를 구하는 것이 과제입니다. 각 병의 용량은 100단위입니다.예시N = 5, K = 4, capacity[] = {1, 2, 3, 2, 1}인 경우를 살펴보겠습니다.용량이 가장 작은 4개의 잔은 {1, 1, 2, 2}이며, 이를 모두 채우는 데 필요한 물의 양은 총 6단위입니다.병 하나의 용량이 100단위이므로, 병 1개만 열면 충분합니다.알고리즘정확히 K개의 잔을 채우려면 용량이 가장 작은 K개의 잔을 선택해
문제 설명 여는 괄호 (와 닫는 괄호 )로만 이루어진 문자열이 주어집니다. 이 문자열에 괄호를 최소한으로 추가하여 결과 문자열이 유효한(valid) 괄호 문자열이 되도록 만들어야 합니다. 유효한 괄호 문자열이란 모든 여는 괄호가 자신과 짝을 이루는 닫는 괄호를 가지며, 그 순서도 올바른 경우를 의미합니다. 예시 예를 들어 str = ((() 라면, 문자열 끝에 닫는 괄호 2개 ))를 붙여야 하므로 필요한 괄호의 최소 개수는 2입니다. 접근 방법 단순히 여는 괄호와 닫는 괄호의 개수 차이(abs)만 계산하는 방법도 있지만, 이 방
문제 설명처음 N개의 자연수(1부터 N까지)로 이루어진 순열 형태의 배열이 주어집니다. 한 번의 연산으로 배열의 임의의 접두사(prefix), 즉 앞부분 일부를 뒤집을 수 있습니다. 이때 배열 전체가 오름차순으로 정렬되기 위해 필요한 최소 연산 횟수를 구하는 것이 이 문제의 목표입니다.예시배열이 {1, 2, 4, 3}이라면, 오름차순으로 정렬하기 위해 최소 3번의 반전이 필요합니다.배열 전체를 뒤집기 → {3, 4, 2, 1}앞의 두 원소를 뒤집기 → {4, 3, 2, 1}배열 전체를 다시 뒤집기 → {1, 2, 3, 4}접근 방법
문제 개요연속된 숫자로 이루어진 문자열과 하나의 수 Y가 주어졌을 때, 아래 조건을 모두 만족하는 최소한의 집합 개수를 구하는 것이 이번 문제의 목표입니다.각 집합은 문자열에서 연속된 숫자들로 구성되어야 합니다.같은 자릿수는 두 번 이상 사용할 수 없습니다.집합에 포함된 수는 Y보다 커서는 안 됩니다.예시예를 들어 str = 1234이고 Y = 20이라면, 아래와 같이 세 개의 집합이 만들어지므로 정답은 3입니다.{12} {3} {4}1234를 그대로 하나의 수로 보면 1234는 Y인 20을 초과하기 때문에, 숫자를 적절히 끊어 각