OpenMP란 무엇인가?OpenMP는 C, C++, 포트란(FORTRAN)으로 작성된 프로그램을 위한 컴파일러 지시문(compiler directive) 집합이자 API로, 공유 메모리(shared-memory) 환경에서의 병렬 프로그래밍을 지원합니다.OpenMP는 동시에 실행될 수 있는 코드 블록을 병렬 영역(parallel region)으로 정의합니다. 애플리케이션 개발자는 코드 내 병렬 영역에 컴파일러 지시문을 삽입하고, 이 지시문은 OpenMP 런타임 라이브러리에 해당 영역을 병렬로 실행하도록 지시합니다.다음 C 언어 예제는
분할 정복(Divide and Conquer)은 하나의 문제를 재귀적으로 여러 개의 동일한 유형을 가진 작은 하위 문제로 나누어, 쉽게 해결할 수 있도록 만드는 패러다임에 기반한 알고리즘입니다.예시분할 정복 기법을 더 깊이 이해하기 위해 간단한 예시를 살펴보겠습니다.function recursive(input x size n) if(n < k) 입력을 크기가 n/p인 m개의 하위 문제로 분할하고,&nbs
C 프로그래밍 언어에서는 중심 좌표, 반지름, 그리고 호가 그려질 각도를 지정하여 원의 일부분인 원호(arc)를 화면에 그릴 수 있습니다.원호를 생성할 때 사용하는 것이 바로 arc() 함수입니다. 이 함수는 C의 graphics.h 헤더 파일에 포함되어 있으며, 해당 라이브러리에는 출력 화면에 다양한 도형을 그릴 수 있는 그래픽 관련 메서드들이 모여 있습니다.arc() 함수 문법void arc(int x, int y, int startangle, int endangle, int radius);이제 함수를 하나씩 자세히 살펴보며,
Windows API에서는 CreateThread() 함수를 사용하여 스레드를 생성합니다. Pthreads와 마찬가지로 이 함수에는 보안 정보, 스택 크기, 스레드 플래그와 같은 속성들이 전달됩니다. 아래 예제 프로그램에서는 이러한 속성들에 기본값을 사용합니다. (기본값으로는 스레드가 일시 중단 상태로 설정되지 않으며, 대신 CPU 스케줄러에 의해 실행될 수 있는 상태가 됩니다.)합계를 계산하는 스레드가 생성된 후에는 Sum 값이 해당 스레드에 의해 설정되기 때문에, 부모 스레드는 Sum 값을 출력하기 전에 반드시 자식 스레드의 작
암시적 스레딩(Implicit Threading)멀티스레드 애플리케이션 설계의 어려움을 해결하고 개발을 더욱 수월하게 만드는 한 가지 방법은, 스레드의 생성과 관리를 애플리케이션 개발자가 아닌 컴파일러와 런타임 라이브러리에 맡기는 것입니다. 이를 암시적 스레딩(implicit threading)이라고 하며, 오늘날 널리 사용되는 추세입니다.암시적 스레딩은 주로 라이브러리나 언어 차원의 지원을 활용해 스레드 관리 작업을 숨기는 방식입니다. C 언어 환경에서 가장 널리 쓰이는 암시적 스레딩 라이브러리는 OpenMP입니다.OpenMP는
Pthreads는 POSIX 표준(IEEE 1003.1c)으로, 스레드 생성과 동기화를 위한 API를 정의한 규격입니다. 여기서 중요한 점은 Pthreads가 스레드의 동작 방식(behavior)에 대한 명세(specification)일 뿐, 그 자체가 구현체(implementation)는 아니라는 것입니다. 따라서 운영체제 설계자는 이 명세를 원하는 방식으로 자유롭게 구현할 수 있습니다.실제로 많은 시스템이 Pthreads 명세를 구현하고 있으며, 대부분 Linux, Mac OS X, Solaris와 같은 UNIX 계열 운영체제입
프로그래밍을 하다 보면 총 일수를 년, 주, 일 단위로 나누어 표현해야 하는 경우가 종종 있습니다. 이번 글에서는 C 언어를 사용해 주어진 일수를 년(year), 주(week), 일(day)로 변환하는 방법을 알아보겠습니다.계산의 편의를 위해 한 해는 365일이라고 가정합니다(윤년은 고려하지 않음). 변환 공식은 다음과 같습니다.변환 공식1. 년 수 계산년 수 = 총 일수 / 365총 일수를 365로 나눈 몫이 바로 년 수가 됩니다.2. 주 수 계산주 수 = (총 일수 % 365) / 7총 일수를 365로 나눈 나머지를 구한 뒤,
화씨(Fahrenheit) 단위의 온도 값 n이 주어졌을 때, 이를 섭씨(Celsius)로 변환한 후 결과를 출력하는 것이 이번 포스팅의 목표입니다.예시입력 1-: 132.00 출력 -: 화씨 132.00을 변환한 섭씨 온도는 55.56 입력 2-: 456.10 출력 -: 화씨 456.10을 변환한 섭씨 온도는 235.61변환 공식화씨 온도를 섭씨 온도로 변환하려면 아래의 공식을 사용합니다.T(°C) = (T(°F) − 32) × 5/9여기서 T(°C)는 섭씨 온도를, T(°F)는
사람의 몸무게와 키가 주어졌을 때, 해당 신체의 체질량 지수(BMI, Body Mass Index)를 계산하여 화면에 출력하는 것이 이번 글의 목표입니다.BMI를 계산하기 위해서는 다음 두 가지 정보가 필요합니다.몸무게(weight)키(height)BMI는 아래 공식을 사용해 계산할 수 있습니다.BMI = 몸무게(kg) ÷ (키(m) × 키(m))이때 몸무게는 킬로그램(kg), 키는 미터(m) 단위를 사용한다는 점에 유의하세요.입출력 예시입력 1 -: 몸무게 = 60.00kg 키 = 1.60m 출력 -: BMI 지
현재 날짜와 한 사람의 생년월일이 주어졌을 때, 그 사람의 현재 나이를 계산하는 것이 이번 문제의 목표입니다. 예시 입력 -: 현재 날짜 -: 21/9/2019 생년월일 -: 25/9/1996 출력 -: 현재 나이 년: 22 월: 11 일: 26 문제 해결에 사용된 접근 방식은 다음과 같습니다 − 현재 날짜와 생년월일을 입력받습니다. 아래 조건들을 확인합니다. 현재 월이 생일 월보다 작은 경우, 올해가 아직 온전히 지나지 않았다는 의미이므로 현재 연도를 그대로 사
3차원 공간에 놓인 두 점의 좌표가 주어졌을 때, 두 점 사이의 거리를 계산하여 그 결과를 화면에 출력하는 것이 이번 예제의 목표입니다. 3차원 거리 계산 공식 3차원 공간에는 x축, y축, z축의 세 축이 존재하며, 각 점은 (x1, y1, z1), (x2, y2, z2)와 같이 세 개의 좌표 성분으로 표현됩니다. 두 점 사이의 거리는 다음과 같은 유클리드 거리 공식을 사용해 바로 계산할 수 있습니다. 거리 = √((x2 − x1)² + (y2 − y1)² + (z2 − z1)²) 즉, 각 축 방향의 좌표 차이를 제곱한 뒤 모두
두 점의 좌표가 주어졌을 때, 두 점 사이의 거리를 계산하여 결과를 화면에 출력하는 것이 이번 글의 목표입니다.두 점 사이의 거리 공식2차원 평면 위에 A(x₁, y₁)와 B(x₂, y₂)라는 두 점이 있다고 가정해 보겠습니다. 이때 두 점 사이의 거리는 다음과 같은 직선 거리(유클리드 거리) 공식으로 간단하게 구할 수 있습니다.$$\sqrt{\lgroup x2-x1\rgroup^{2}+\lgroup y2-y1\rgroup^{2}}$$즉, 두 점의 x좌표 차이와 y좌표 차이를 각각 제곱한 뒤 더하고, 그 값의 제곱근을 구하면 됩니다
프로그래밍에서 분수 연산은 자주 만나게 되는 고전적인 문제 중 하나입니다. 분수 a/b와 c/d가 입력으로 주어졌을 때(a, b, c, d는 0이 아닌 임의의 정수), 이 두 분수를 더해 최종 합을 구하는 것이 이번 글의 목표입니다. 분수의 기본 개념 분수는 a/b 형태로 표현되며, 여기서 a는 분자(numerator), b는 분모(denominator)라고 부릅니다. 분자와 분모에는 어떤 수든 올 수 있지만, 분모는 절대 0이 될 수 없습니다. 두 분수의 합은 a/b + c/d로 나타내며, 덧셈의 기본 규칙은 분모가 반드시 같
주어진 정수 n을 입력받아, 숫자로 이루어진 다이아몬드 패턴을 출력하는 C 프로그램입니다. 이 패턴은 위아래 대칭 구조를 가지며, 중앙을 기준으로 숫자가 증가했다가 감소하는 형태를 띱니다. 실행 예시 입력: n = 3 출력 결과는 다음과 같은 다이아몬드 형태를 가집니다. (이미지 참조) 접근 방식 입력받은 행의 수 n을 기준으로 전체 행 수는 (2 * n) + 1개가 됩니다. 첫 번째 줄과 마지막 줄은 공백 2 * n개 뒤에 0을 출력합니다. 중간 부분(1부터 2n-1까지 행)은 좌우 공백과 숫자 시퀀스로 구성됩니
배열과 세 개의 값 — 왼쪽 값 L, 오른쪽 값 R, 그리고 소수 P가 입력으로 주어졌을 때, L부터 R 사이에 있는 요소들의 곱을 계산한 후 소수 P로 나눈 나머지(모듈로)를 구해 출력하는 것이 이 글의 목표입니다. 아래 그림처럼 여러 요소로 이루어진 배열이 있고, 왼쪽 값 L은 2, 오른쪽 값 R은 6이라고 가정해 보겠습니다. 프로그램은 이 두 위치 사이에 있는 요소들의 곱을 계산해야 합니다. 예시 입력 : A[] = { 1, 2, 3, 4, 5, 6 } P = 29, L = 2, R = 6 출력 : 24 입력 : A[]
n의 값을 입력으로 받아, 함수를 통해 Log n의 값을 계산하고 화면에 출력하는 것이 이 프로그램의 목적입니다. 로그(Logarithm)는 지수 연산의 역함수입니다. 즉, 로그를 계산한다는 것은 주어진 밑(base)을 몇 번 거듭제곱해야 해당 값이 되는지 그 지수를 구하는 과정입니다. 수식으로 표현하면 다음과 같습니다. $$\log_b x\;\:=\: y\:than\:b^{y}=x$$ 예를 들어, $$\log_2 64\;\:=\: 6\:than\:2^{6}=64$$ 예시 입출력 입력-: Log 20 출력-
행렬이 mat[row][column] 형태로 주어졌을 때, 함수를 통해 해당 행렬이 특이 행렬(singular matrix)인지 아닌지를 판별하고 그 결과를 출력하는 것이 이 글의 목표입니다.특이 행렬이란 행렬식(determinant)의 값이 0인 행렬을 말하며, 행렬식이 0이 아니라면 비특이 행렬(non-singular matrix)이라고 부릅니다.따라서 행렬이 특이 행렬인지 여부를 판단하려면 먼저 행렬식을 계산해야 합니다. 3×3 행렬의 행렬식은 다음과 같이 구할 수 있습니다.$$M1[3][3]\:=\:\begin{bmatrix
숫자 n이 주어졌을 때, 이 숫자가 스트롱 넘버(Strong Number)인지 아닌지 판별해야 합니다.스트롱 넘버란 각 자릿수의 팩토리얼 값을 모두 더한 합이 원래 숫자 n과 같아지는 수를 말합니다. 여기서 팩토리얼(factorial)은 어떤 수부터 1까지의 모든 정수를 곱한 값을 의미하며, 느낌표(!) 기호로 나타냅니다. 예를 들어 4! = 4×3×2×1 = 24입니다.따라서 어떤 수가 스트롱 넘버인지 확인하려면 그 수의 모든 자릿수를 하나씩 추출해야 합니다. 예를 들어 숫자가 145라면 1, 4, 5를 각각 뽑아낸 후, 각 숫자
정수 형태의 연도(year), 월(month), 일(day)이 주어졌을 때, 해당 날짜가 실제로 존재할 수 있는 날짜인지 판별하는 프로그램을 C 언어로 작성해 보겠습니다.여기서 유효한 날짜의 범위는 1800년 1월 1일부터 9999년 12월 31일까지이며, 이 범위를 벗어나는 날짜는 모두 잘못된 날짜로 간주합니다. 단순히 연도 범위만 확인하는 것이 아니라, 달력상의 날짜가 갖추어야 할 모든 제약 조건까지 함께 검사해야 합니다.유효한 날짜의 조건날짜가 유효하려면 다음 조건들을 모두 만족해야 합니다.일(day)은 1 이상 31 이하여야
대소문자가 섞여 있는 문자열이 주어졌을 때, 각 단어의 첫 문자는 대문자로, 나머지 문자는 모두 소문자로 변환하는 것이 이번 글의 목표입니다. 간단한 예시를 통해 개념을 자세히 살펴보겠습니다. 예를 들어 문자열 “hElLo world”가 주어진 경우, 첫 문자 h를 대문자 H로 바꾸고, 공백이나 문자열 끝 앞까지의 나머지 모든 문자는 소문자로 변환해야 합니다. 또한 공백 다음에 등장하는 첫 번째 문자 역시 대문자로 변환해야 합니다. 예제 입력: str[] = {"heLlO wORLD"} 출력: Hello Worl