Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 프로그래밍

  1. C/C++로 전화 번호에 대응하는 모든 문자열 조합 출력하기

    문제 개요주어진 전화 번호에 대해, 일반적인 전화기 자판 규칙에 따라 해당 번호를 누를 때 만들어낼 수 있는 모든 문자열 조합을 화면에 출력하는 프로그램을 C/C++로 작성하는 방법을 알아보겠습니다.전화 자판 매핑 규칙숫자 2 → A, B, C 중 하나숫자 3 → D, E, F 중 하나숫자 4 → G, H, I 중 하나숫자 5 → J, K, L 중 하나숫자 6 → M, N, O 중 하나숫자 7 → P, Q, R, S 중 하나숫자 8 → T, U, V 중 하나숫자 9 → W, X, Y, Z 중 하나숫자 1과 0은 각각 1, 0으로만

  2. C/C++로 이해하는 베르트랑 투표 정리(Bertrand's Ballot Theorem)

    베르트랑(Bertrand)은 자신의 원래 논문에서 점화 관계(recursion relation)를 활용한 일반 공식을 바탕으로, 유리한 순서의 개수를 계산하는 증명 방법을 설명했습니다. 베르트랑 투표 정리에 따르면, 개표 과정에서 후보 A가 후보 B보다 항상 앞서 있을 확률은 다음과 같이 계산됩니다.P = (p − q) / (p + q)여기서 p는 A에 투표한 유권자 수, q는 B에 투표한 유권자 수입니다. 아래 예제를 통해 이 정리가 실제로 어떻게 적용되는지 살펴보겠습니다.예제총 5명의 유권자가 있다고 가정해 보겠습니다. 이 중

  3. 인덱스 범위 내 최댓값을 위한 이진 문자열 정렬 – C/C++ 그리디 구현

    문제 설명 0과 1로만 구성된 이진 문자열이 주어지고, 서로 겹치지 않는 M개의 구간 [A1, B1], [A2, B2], …, [AM, BM](단, A ≤ B)이 함께 주어집니다. 임의의 두 구간 i ≠ j에 대해 항상 Ai < Bj 또는 Bj < Ai가 성립하므로, 어떤 두 구간도 서로 겹치지 않습니다. 목표는 다음 두 조건을 동시에 만족하는 유효한 재배열(순열)을 찾는 것입니다. 구간 합 최대화: 주어진 M개의 구간에 포함된 숫자들의 합이 가능한 한 커야 합니다. 사전순 최대: 문자열 전체가 사전순으로 최대가 되어야

  4. C/C++로 이해하는 Barabási-Albert 그래프: 스케일 프리 네트워크 모델의 원리

    바라바시-알버트(BA) 모델이란?바라바시-알버트(Barabási-Albert, BA) 모델은 스케일 프리(scale-free) 네트워크를 생성하기 위해 제안된 여러 모델 중 하나로 널리 다루어집니다. 이 모델은 성장(growth)과 우선적 연결(preferential attachment)이라는 두 가지 핵심 개념을 결합한 것이 특징입니다. 이 두 개념은 실제 세계의 다양한 네트워크에서 광범위하게 관찰됩니다.1. 성장(Growth)성장이란 네트워크를 구성하는 노드(node)의 수가 시간이 지남에 따라 계속 증가한다는 의미입니다. 즉,

  5. 이진수 시스템 – C/C++ 산술 덧셈 오버플로의 원리와 감지 방법

    2의 보수(2s Complement) 체계란?2의 보수 체계는 현대 컴퓨터 아키텍처에서 가장 널리 채택되고 있는 정수 표현 방식입니다. N비트 2의 보수 체계는 -2n-1부터 2n-1-1까지의 숫자를 표현할 수 있습니다.4비트: -8부터 7까지 표현 가능5비트: -16부터 15까지 표현 가능오버플로는 언제 발생하는가?오버플로(Overflow)는 N비트 2의 보수 두 수를 더했을 때, 그 결과가 해당 N비트 범위에 담을 수 없을 만큼 커지는 상황에서 발생합니다.컴퓨터 내부에는 N비트 고정 크기의 레지스터가 있으며, 두 개의 N비트 수

  6. C 언어로 정수를 로마 숫자로 변환하는 방법

    10진수 n이 주어졌을 때, 이를 로마 숫자(Roman Numeral)로 변환하는 프로그램을 만들어 보겠습니다. 입력 값 n은 1부터 4000 사이의 범위를 가집니다. 먼저 주요 로마 숫자와 그에 대응하는 값을 살펴보겠습니다.숫자로마 숫자1I4IV5V9IX10X40XL50L90XC100C400CD500D900CM1000M4000MMMM예를 들어 n = 859라면, 변환된 로마 숫자는 DCCCLIX가 됩니다.문제 해결 접근 방식이 문제는 다음 단계를 따라 해결할 수 있습니다.로마 숫자 기호와 그에 대응하는 값을 함께 저장하는 배열(이

  7. C/C++에서 중괄호 없이 2차원 행렬 줄바꿈하여 출력하기

    C/C++ 프로그래밍 언어에서 중괄호({})를 사용하지 않고 2차원 행렬을 출력하는 코드를 살펴보겠습니다.중괄호는 프로그래밍 언어에서 구분자 역할을 하는 기호로, 프로그램 내에서 독립적인 코드 블록을 정의하는 데 사용됩니다. C/C++에서는 중괄호 없이 스코프(범위)를 정의하기 어렵기 때문에, 이번에 소개할 기법은 꽤 흥미로운 주제입니다.먼저 2차원 행렬을 출력하는 기본 코드와 실행 결과부터 확인해 보겠습니다.기본 예제#include <iostream> using namespace std; int main() {

  8. C 언어에서 스레드를 활용해 1 2 3 시퀀스를 무한히 출력하는 방법

    이 글에서는 C 프로그래밍 언어에서 스레드(thread)를 사용하여 1 2 3 시퀀스를 무한히 반복해서 출력하는 방법을 알아보겠습니다.목표 출력 결과먼저 우리가 만들고자 하는 코드의 예상 출력은 다음과 같습니다.1 2 3 1 2 3 1 2 3 1 2 3구현 아이디어이 문제를 해결하려면 C 언어에서 세 개의 스레드가 동시에 병렬로 실행되도록 구성해야 합니다.핵심 개념은 다음과 같습니다.세 개의 스레드가 각각 1, 2, 3 중 하나의 숫자를 담당합니다.초기값이 1로 설정된 공유 변수를 두고, 각 스레드는 이전 값에 따라 자신의 차례인지

  9. C 언어에서 비밀번호 입력 시 문자 대신 * 별표 출력하기

    문제 개요이 문제에서는 비밀번호 문자열이 주어졌을 때, 실제 문자 대신 *(별표)를 화면에 출력하는 것이 목표입니다. 터미널에서 비밀번호를 입력할 때 보안을 위해 입력 내용이 그대로 노출되지 않고 별표로 표시되는 것과 같은 원리입니다.예시입력: password 출력 ********해결 방법이 문제는 매우 간단하게 해결할 수 있습니다. 먼저 입력받은 비밀번호의 길이를 구한 뒤, 문자열을 한 글자씩 순회하면서 각 문자 대신 별표(*)를 출력하면 됩니다.핵심 아이디어는 다음과 같습니다:비밀번호 문자열의 길이를 strlen() 함수로 계산

  10. C 언어 사전 정의 식별자 __func__ 완벽 가이드

    식별자(Identifier)는 프로그래밍에서 변수나 함수 등 개체를 프로그램 내에서 구분하고 참조하기 위해 부여하는 이름입니다.일반적으로 식별자는 프로그래머가 직접 만들지만, 언어 차원에서 기본 제공되는 사전 정의 식별자도 존재합니다. 대표적인 예로 cout, cin 등이 있습니다.이 글에서는 C 프로그래밍 언어가 기본으로 제공하는 사전 정의 식별자 중 하나인 __func__에 대해 자세히 알아보겠습니다.__func__의 공식 정의C 표준에서 __func__는 다음과 같이 정의됩니다.“식별자 __func__는 각 함수 정

  11. C/C++에서 배열이 함수로 전달되는 방식 – 포인터로 변환되는 이유

    개요이 글에서는 C/C++ 프로그램에서 배열이 함수에 어떻게 전달되는지 살펴봅니다. 결론부터 말하면, C/C++에서 배열을 함수 인자로 넘기면 배열 전체가 복사되는 것이 아니라 배열의 첫 번째 요소를 가리키는 포인터(pointer) 형태로 전달됩니다. 이러한 현상을 흔히 배열의 감쇠(array decay)라고 부릅니다.배열이 포인터로 전달되는 이유배열 전체를 값으로 복사하면 메모리 사용량과 성능 면에서 비효율적일 수 있습니다. 그래서 C 언어 설계 당시부터 배열 이름은 대부분의 표현식에서 첫 번째 요소를 가리키는 포인터로 암묵적으로

  12. C/C++ 벡터(Vector) 작동 원리 완벽 이해하기

    이 글에서는 C/C++에서 벡터(vector)가 어떻게 작동하는지 예제 코드와 함께 자세히 알아보겠습니다.벡터란 무엇인가?벡터는 표준 배열을 개선한 동적 배열(dynamic array) 자료구조입니다. 일반 배열은 선언 시점에 크기가 고정되어 이후에 변경할 수 없지만, 벡터는 사용자의 필요에 따라 크기를 손쉽게 늘리거나 줄일 수 있습니다.이러한 유연성 덕분에 기존 배열에서 새 배열로 요소를 일일이 복사해야 하는 번거로움과 시간 낭비를 크게 줄일 수 있습니다.배열과 벡터의 주요 차이점크기 조절: 배열은 고정 크기, 벡터는 실행 중 동

  13. 리눅스에서 graphics.h 라이브러리를 GCC 컴파일러에 설치하고 사용하는 방법

    이 튜토리얼에서는 리눅스 환경에서 graphics.h C/C++ 라이브러리를 GCC 컴파일러에 추가하는 방법을 단계별로 알아봅니다.graphics.h는 원래 Turbo C++(DOS 시절)에서 제공되던 그래픽 라이브러리로, 리눅스에서는 이를 대체하는 오픈소스 패키지인 libgraph를 설치해야 사용할 수 있습니다.1단계: 필수 빌드 도구 및 의존성 패키지 설치먼저 컴파일에 필요한 build-essential과 libgraph가 의존하는 여러 외부 라이브러리들을 설치합니다. 터미널을 열고 아래 명령어를 차례대로 실행하세요.>&g

  14. C/C++에서 세미콜론 없이 세미콜론(;) 출력하는 방법

    이 튜토리얼에서는 C/C++에서 세미콜론 문자를 소스 코드에 직접 작성하지 않고도 세미콜론(;)을 화면에 출력하는 프로그램을 만드는 방법을 알아보겠습니다.구현 방법은 크게 두 가지가 있습니다. 첫 번째는 세미콜론의 아스키(ASCII) 코드 값을 활용하는 방법이고, 두 번째는 사용자 정의 매크로를 정의하여 사용하는 방법입니다. 핵심은 세미콜론의 아스키 코드 값이 59라는 점입니다.방법 1: putchar() 함수 사용putchar() 함수는 인자로 전달된 아스키 값에 해당하는 문자를 표준 출력으로 내보냅니다. 따라서 세미콜론의 아스키

  15. C/C++에서 산술 연산자 없이 두 정수의 합을 구하는 방법

    C/C++ 프로그래밍에서 + 연산자와 같은 산술 연산자를 사용하지 않고 두 정수의 합을 구해야 하는 경우가 있습니다. 면접 문제로도 자주 등장하는 이 주제는 크게 두 가지 방법으로 해결할 수 있습니다.포인터(pointer) 활용비트 연산자(bitwise operator) 활용각각의 방법을 예제 코드와 함께 자세히 살펴보겠습니다.방법 1: 포인터를 이용한 덧셈배열 인덱싱의 원리를 활용하면 산술 연산자 없이 덧셈을 수행할 수 있습니다. 배열에서 p[b]는 포인터 p로부터 b개의 요소만큼 떨어진 주소를 의미합니다. 즉, 내부적으로 포인터

  16. C/C++ 스레드 함수 완벽 정리: pthread로 배우는 멀티스레딩 기초

    이번 튜토리얼에서는 C/C++에서 스레드(thread) 함수가 어떻게 동작하는지 예제 프로그램을 통해 살펴보겠습니다. 스레드 함수를 사용하면 여러 작업을 동시에(concurrently) 수행할 수 있습니다. 각 스레드는 서로 의존하며 실행할 수도 있고, 완전히 독립적으로 실행할 수도 있습니다. C/C++ 스레드 프로그래밍의 핵심 함수 C 언어에서는 POSIX 스레드 라이브러리(pthread)를 사용해 멀티스레딩을 구현합니다. 이 예제에서 사용되는 주요 함수는 다음과 같습니다. pthread_create() : 새로운 스레드를 생

  17. C/C++ continue 문 완벽 가이드: 반복문 흐름 제어하기

    이번 튜토리얼에서는 C/C++ 프로그래밍에서 continue 문이 어떻게 동작하는지 예제와 함께 자세히 알아보겠습니다.continue 문이란?continue 문은 반복문의 흐름을 제어하는 제어문입니다. break 문처럼 반복문을 완전히 빠져나가는 것이 아니라, 현재 진행 중인 반복(iteration)의 나머지 코드를 건너뛰고 곧바로 다음 반복으로 넘어가도록 강제합니다.즉, 특정 조건에서만 코드 실행을 생략하고 싶을 때 continue 문을 유용하게 사용할 수 있습니다.예제 코드아래 예제는 1부터 10까지 숫자를 출력하되, 값이 6일

  18. C/C++에서 문자열을 정수 배열로 변환하는 방법

    개요 C/C++ 프로그래밍을 하다 보면 2, 6, 3, 14처럼 쉼표로 구분된 숫자 문자열을 실제 정수 배열로 변환해야 하는 경우가 종종 있습니다. 이번 튜토리얼에서는 문자열을 정수 배열로 변환하는 방법을 단계별로 살펴보겠습니다. 변환 아이디어 핵심 접근 방식은 다음과 같습니다. 새로운 정수 배열을 준비합니다. 주어진 문자열을 한 글자씩 순회하면서, 쉼표(,)를 만나면 다음 배열 요소로 이동합니다. 숫자 문자라면 기존 값에 10을 곱한 뒤 새 자릿수를 더해 여러 자리 숫자를 완성합니다. 공백 문자는 건너뛰어 잘못된 값이 배열에

  19. C/C++에서 문자열을 숫자로 변환하는 방법

    이 글에서는 C/C++에서 문자열(string)을 숫자(number)로 변환하는 방법에 대해 자세히 알아보겠습니다.C/C++에서는 문자열을 숫자로 변환할 때 크게 두 가지 방법을 사용할 수 있습니다. 하나는 C 스타일 함수인 sscanf()이고, 다른 하나는 C++11에서 도입된 stoi()입니다.1. sscanf() 함수 사용하기sscanf()는 <stdio.h> 헤더에 정의된 함수로, 형식 지정자(%d, %f 등)를 활용해 문자열에서 원하는 타입의 값을 추출할 수 있습니다. C와 C++ 양쪽에서 모두 동작한다는 장점이

  20. C/C++ 코어 덤프(세그먼테이션 오류)의 원인과 해결 방법

    이 글에서는 C/C++ 프로그래밍에서 자주 마주치는 코어 덤프(Core Dump), 즉 세그먼테이션 오류(Segmentation Fault)가 발생하는 원인을 예제 코드와 함께 살펴봅니다.세그먼테이션 오류는 프로그램이 허용되지 않은 메모리 영역에 접근할 때 발생합니다. 대표적인 원인으로는 다음과 같은 경우가 있습니다.읽기 전용(read-only) 메모리 영역에 데이터를 쓰려고 시도할 때손상되었거나 유효하지 않은 메모리 주소에 접근하려고 할 때이미 해제(free)된 메모리를 다시 사용하려고 할 때예제 1: 문자열 리터럴 수정문자열 리

Total 1443 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:45/73  20-컴퓨터/Page Goto:1 39 40 41 42 43 44 45 46 47 48 49 50 51