C나 C++ 소스 코드를 보면 (#) 기호로 시작하는 문장들을 종종 발견하게 됩니다. 이것이 바로 전처리기 지시문(Preprocessing Directives)입니다. 이러한 지시문은 실제 컴파일이 시작되기 전에 진행되는 전처리 단계에서 처리되며, 코드 생성 과정에 중요한 역할을 합니다.이번 글에서는 대표적인 전처리기 지시문 세 가지 유형을 살펴보겠습니다.조건부 컴파일(Conditional Compilation)라인 제어(Line Control)오류 지시문(Error Directive)1. 조건부 컴파일 (#ifdef, #elif,
이 글에서는 n번째 항이 n2 − (n−1)2로 주어지는 수열의 합을 구하는 방법을 알아보겠습니다. 이 수열의 일반항은 다음과 같습니다.Tn = n2 − (n−1)2수열의 패턴 분석일반항을 전개하면 다음과 같이 간단히 단순화할 수 있습니다.Tn = n2 − (n2 − 2n + 1) = 2n − 1즉, 이 수열은 1, 3, 5, 7, … 과 같은 홀수 수열입니다. 처음 n개의 홀수의 합은 잘 알려진 공식에 따라 다음과 같습니다.S = 1 + 3 + 5 + … + (2n − 1) = n2따라서 반복문 없이도 수열의 합을 한 번의 연산으
이번 글에서는 멀티스레드 환경을 활용해 행렬의 덧셈과 뺄셈을 수행하는 방법을 알아보겠습니다. C/C++에서는 pthread(POSIX 스레드) 라이브러리를 사용하여 여러 개의 스레드를 동시에 실행할 수 있습니다.기본 개념두 개의 행렬 A와 B가 있으며, 각 행렬의 크기는 (m × n)입니다. 각 스레드는 행렬의 한 부분(행 그룹)을 담당하여 해당 영역의 덧셈 또는 뺄셈을 병렬로 처리합니다. 예제 코드에서는 3개의 코어를 가정하고, 각 스레드가 전체 행렬의 1/3씩 나누어 계산하도록 구현했습니다. 즉, 덧셈용 스레드 3개와 뺄셈용 스
문제 이해하기크기가 n인 배열과 목표 합계 S가 주어졌을 때, 배열에서 특정 값 K를 찾는 문제입니다. 배열에서 K보다 큰 모든 원소를 K로 바꾸었을 때 최종 배열의 총합이 정확히 S가 되는 K를 구하고, 그런 값이 존재하지 않으면 -1을 반환해야 합니다.예를 들어 배열이 {12, 6, 3, 7, 8}이고 목표 합계가 15라고 가정해 보겠습니다. 이때 답은 3입니다. 3보다 큰 원소들을 모두 3으로 바꾸면 최종 배열은 {3, 3, 3, 3, 3}이 되고, 그 합은 정확히 15(S)가 됩니다.알고리즘핵심 아이디어는 배열을 오름차순으로
이 프로그램에서는 주어진 여러 개의 이진수를 모두 더하는 작업을 수행합니다. 총 n개의 이진수 문자열이 입력으로 주어지며, 이들을 전부 합산하여 하나의 이진수 결과를 출력해야 합니다.이를 위해 기본적인 이진수 덧셈 논리를 활용하여, 첫 번째 항부터 N번째 항까지 차례대로 하나씩 더해가며 최종 결과를 얻습니다.입력: 1011, 10, 1001 출력: 10110풀이 방법 설명가장 간단한 방법은 이진수 문자열을 십진수 값으로 변환한 뒤 모두 더하고, 다시 이진수로 변환하는 것입니다. 하지만 여기서는 변환 과정 없이 직접 이진수 덧셈을 수
토큰(token)은 프로그램을 구성하는 가장 작은 개별 단위입니다. 문장이 단어들의 조합으로 이루어지듯, C++ 프로그램 역시 여러 개의 토큰이 모여 만들어집니다.C++는 C 언어의 상위 집합(superset)이기 때문에 C에서 사용하던 대부분의 구문은 그 의미와 용법이 그대로 유지된 채 C++에서도 유효합니다. 따라서 토큰, 표현식(expression), 데이터 타입 등도 C와 매우 유사합니다.C++의 주요 토큰 종류는 다음과 같습니다.키워드(Keywords)식별자(Identifiers)상수(Constants)변수(Variable
수학에는 C 프로그래밍으로 손쉽게 풀 수 있는 다양한 종류의 급수가 있습니다. 이번 포스팅에서는 다음과 같은 급수의 합을 구하는 방법을 살펴보겠습니다.Tn = n2 - (n-1)2급수의 모든 항의 합 Sn을 다음 조건에 맞게 구합니다.Sn = T1 + T2 + T3 + T4 + ...... + Tn입력: 229137999출력: 218194447풀이 설명Tn은 간단한 전개를 통해 2n-1 형태로 표현할 수 있습니다.식을 전개해 보면,=> Tn = n² - (n-1)²=> Tn = n² - (1 + n² - 2n)=>
양의 정수로 이루어진 배열에서 홀수 번 등장하는 수를 찾는 C++ 프로그램을 살펴보겠습니다. 이 배열에서는 모든 수가 짝수 번씩 등장하고, 단 하나의 수만 홀수 번 나타난다고 가정합니다.입력: arr[] = {5, 7, 8, 8, 5, 8, 8, 7, 7} 출력: 7위 예제에서 각 요소의 등장 횟수를 세어 보면 다음과 같습니다. 5 → 2번 (짝수) 7 → 3번 (홀수) ✅ 8 → 4번 (짝수) 알고리즘 설명가장 직관적인 방법은 중첩 반복문(이중 루프)을 사용하는 것입니다. 외부 루프는 배열의 모든 요소를 하나씩 순회합니다. 내부
문제 개요 주어진 문자열의 문자들을 재배치하여 모음과 자음이 번갈아 위치하도록 만드는 것이 이번 문제의 목표입니다. 만약 그런 방식으로 재배치하는 것이 불가능하다면 not possible을 출력해야 합니다. 단, 재배치 과정에서 모음들끼리의 상대적인 순서와 자음들끼리의 상대적인 순서는 반드시 유지되어야 한다는 점이 중요합니다. 입력: abce 출력: abec 풀이 접근 방법 문자열에 포함된 모음과 자음의 개수를 각각 셉니다. 모음 개수와 자음 개수의 차이가 1보다 크면 교대 배치가 불가능하므로 Not Possible을 반환합니다.
이 글에서는 C 언어로 팬케이크 정렬(Pancake Sort)을 구현하는 방법을 소개합니다. 팬케이크 정렬은 일반적인 비교 기반 정렬과 달리, 수열의 접두사(prefix) 요소들을 뒤집는 연산만 허용되는 변형된 정렬 문제입니다.팬케이크 정렬이란?팬케이크 정렬은 크기가 뒤죽박죽인 팬케이크 더미를 크기 순서대로 쌓는 수학적 문제에서 유래한 이름입니다. 이때 주걱(spatula)을 더미의 어느 위치든 삽입할 수 있고, 주걱 위에 있는 모든 팬케이크를 한 번에 뒤집을 수 있다고 가정합니다.여기서 팬케이크 넘버(pancake number)란
C 프로그래밍에서 배열을 왼쪽으로 지정한 횟수만큼 회전하는 것은 자주 등장하는 기본 알고리즘 문제입니다. 이 글에서는 배열을 왼쪽으로 n칸 회전하는 논리를 단계별로 살펴보고, 실제로 동작하는 C 예제 코드와 실행 결과까지 함께 확인해 보겠습니다.문제 개요입력: arr[] = 1 2 3 4 5 6 7 8 9 10 N = 3 출력: 4 5 6 7 8 9 10 1 2 3풀이 접근 방식배열 arr에 요소들을 입력받습니다.회전할 횟수를 변수 N에 저장합니다.배열을 왼쪽으로 1칸씩 회전하는 동작을 N번 반복합니다. 여기서 왼쪽 회전이란 모든
숫자 n이 입력으로 주어졌을 때, 이 프로그램은 n의 약수(제수)의 총 개수가 짝수인지 홀수인지 판별하는 문제입니다.짝수(Even)는 2로 정확히 나누어 떨어지는 정수입니다. 예: 0, 8, -24홀수(Odd)는 2로 나누어 떨어지지 않는 정수입니다. 예: 1, 7, -11, 15입력: 10 출력: Even문제 접근 방법n의 모든 약수를 구한 뒤, 약수의 총 개수가 짝수인지 홀수인지 확인하면 됩니다. 즉, 모든 약수를 찾아 개수를 센 다음, 그 숫자를 2로 나누었을 때 나머지가 0인지 검사하는 방식입니다.구현 예제#include &
미로 속의 쥐(Rat in a Maze)는 백트래킹(backtracking) 기법을 활용하는 대표적인 알고리즘 문제 중 하나입니다.미로는 일부 칸이 막혀 있는 2차원 행렬입니다. 행렬에는 출발점 역할을 하는 출발 셀(source cell)과 도착해야 하는 목적지 셀(destination cell)이 하나씩 존재하며, 우리가 해야 할 일은 막힌 칸에 들어가지 않으면서 출발점에서 목적지까지 가는 경로를 찾는 것입니다. 아래는 아직 풀리지 않은 미로의 모습입니다.그리고 이것이 그 해답입니다.접근 방식이 퍼즐을 풀려면 먼저 출발 셀에서 시
반대칭 행렬(Skew-Symmetric Matrix)이란? 정사각 행렬 A의 모든 원소에 대해 aij = −aji가 성립할 때, 행렬 A를 반대칭 행렬(skew-symmetric matrix)이라고 부릅니다. 다시 말해, 행렬 A의 전치행렬(transpose)이 원래 행렬의 음수와 같을 때, 즉 AT = −A가 성립하면 행렬 A는 반대칭 행렬입니다. 반대칭 행렬에는 한 가지 중요한 특징이 있습니다. 바로 주대각선(main diagonal)의 모든 원소가 반드시 0이라는 점입니다. 반대칭 행렬 예시 A = | 0 -5 4 |
프로그래밍에서 나눗셈을 다룰 때 가장 기본이 되는 개념이 바로 몫(quotient)과 나머지(remainder)입니다. 이 글에서는 피제수(dividend)와 제수(divisor) 두 숫자가 주어졌을 때, C 언어를 이용해 나눗셈의 몫과 나머지를 구하는 프로그램을 작성하는 방법을 알아보겠습니다. 나눗셈의 기본 용어 정리 나눗셈에는 네 가지 요소가 서로 밀접한 관계를 맺고 있습니다. 피제수(Dividend): 나누어지는 수 제수(Divisor): 나누는 기준이 되는 수 몫(Quotient): 나눗셈의 결과값 나머지(Remainde
이번 글에서는 C 프로그래밍을 활용해 텍스트 파일에 담긴 전체 줄 수를 구하는 방법을 살펴보겠습니다.이 프로그램은 지정한 파일을 연 뒤 내용을 한 문자씩 읽어 들이고, 마지막에 파일의 총 줄 수를 출력합니다. 줄 수를 세는 핵심 아이디어는 간단합니다. 바로 개행 문자(\n)가 등장할 때마다 카운트를 1씩 증가시키는 것입니다.입력: 파일 test.txt Hello friends, how are you? This is a sample file to get line numbers from the file. 출력: 총 줄 수
이 프로그램은 주어진 수를 여러 인수의 곱으로 분해할 때, 인수들의 합이 최소가 되는 값을 찾습니다. 문제를 해결하는 기본 아이디어는 가능한 모든 인수 조합을 찾아 각각의 합을 계산하고, 그중에서 가장 작은 값을 선택하는 것입니다.입력: n = 12출력: 7문제 설명먼저 수 n의 인수들을 구한 뒤 이들을 더하여 합을 최소화해야 합니다. 12를 인수분해하는 다양한 방법과 각 경우의 인수 합은 다음과 같습니다.12 = 12 × 1 → 12 + 1 = 1312 = 2 × 6 → 2 + 6 = 812 = 3 × 4 → 3 + 4 = 712
선형 탐색(Linear Search) 알고리즘은 찾고자 하는 대상 값을 배열의 각 요소와 하나씩 차례로 비교하는 가장 기본적인 탐색 방법입니다. 해당 요소를 발견하면 그 위치를 출력합니다.선형 탐색의 최악의 경우 시간 복잡도는 O(n)입니다. 즉, 찾는 값이 배열의 마지막에 있거나 아예 없는 경우 배열 전체를 모두 훑어야 합니다.입력: arr[] = { 12, 35, 69, 74, 165, 54} 찾을 값 = 165 출력: 165는 위치 5에 있습니다.선형 탐색이란?선형 탐색은 주어진 숫자가 배열 안에 존재하는지 확인하고, 존재한다
문제 소개이번 글에서는 모듈러(나머지) 방정식과 관련된 흥미로운 문제를 다뤄보겠습니다. 두 정수 A와 B가 주어졌을 때, (A mod X) = B를 만족하는 변수 X가 가질 수 있는 값의 개수를 구하는 것이 목표입니다.예를 들어 A가 26이고 B가 2라고 가정해 봅시다. 이때 조건을 만족하는 X의 후보 값은 {3, 4, 6, 8, 12, 24}이며, 따라서 정답은 6이 됩니다. 핵심 아이디어를 더 잘 이해하기 위해 알고리즘부터 살펴보겠습니다.핵심 아이디어(A mod X) = B가 성립하려면, A에서 B를 뺀 값인 N = A − B가
이번에는 흥미로운 문제 하나를 살펴보겠습니다. 값 n이 주어졌을 때, 길이가 n이면서 연속된 1(11)이 포함되지 않는 모든 이진 문자열의 개수를 구하는 것입니다.예를 들어 n = 2라면 가능한 문자열은 {00, 01, 10} 세 가지뿐이므로 출력 결과는 3이 됩니다. 11은 연속된 1을 포함하므로 제외됩니다.동적 계획법(Dynamic Programming)을 이용한 풀이이 문제는 동적 계획법으로 효율적으로 해결할 수 있습니다. 두 개의 배열 a와 b를 사용합니다.a[i]: 길이가 i이고, 연속된 1이 없으며, 마지막 문자가 0으로