종이 한 장의 크기, 즉 길이 L과 너비 B가 주어지고, 잘라내고자 하는 작은 직사각형의 크기인 길이 l과 너비 b도 함께 주어집니다. 이 문제의 목표는 종이 한 장에서 잘라낼 수 있는 작은 직사각형의 최대 개수를 구하는 것입니다.해결 과정은 다음과 같습니다.가로 방향 배치: 종이의 길이 L에 직사각형의 길이 l을 맞추고, 너비 B에 너비 b를 맞춰 배치한 뒤 개수를 셉니다.세로 방향 배치: 같은 방식으로 세로 방향으로 배치했을 때의 개수도 계산합니다.두 경우 중 더 많은 개수를 결과로 반환합니다.예시를 통해 살펴보겠습니다.입력종이
이 문제에서는 직선의 개수 N과 각 직선을 정의하는 두 점의 좌표 (x1, y1), (x2, y2)가 주어집니다. 목표는 주어진 직선들 중 두 직선이 서로 겹쳐 덮지 않으면서 하나의 점을 통과할 수 있는 직선의 최대 개수를 구하는 것이며, 회전은 고려하지 않습니다. 직선은 일반적으로 (m, c) 쌍으로 표현합니다. 여기서 y = mx + c 형태이며, m은 기울기입니다. 기울기는 다음 공식으로 계산됩니다. m = (y2 - y1) / (x2 - x1) 기울기(m)가 같지만 c1 ≠ c2인 두 직선은 서로 평행합니다. 따라서 서로 다
C나 C++에서 변수를 선언만 하고 초기화하지 않으면, 그 변수는 과연 어떤 값을 가지고 있을까요? 많은 개발자가 컴파일러가 자동으로 int에는 0을, float에는 0.0을 할당해 준다고 생각합니다. 그렇다면 char 타입은 어떨까요? 이번 글에서는 실제 코드를 여러 컴파일 환경에서 실행하며 그 결과를 직접 확인해 보겠습니다. 예제 코드 (C++) 다음 예제는 char, float, int, double, long 다섯 가지 기본 데이터 타입 변수를 선언한 뒤 초기화 없이 바로 출력하는 코드입니다. #include <iost
가변 길이 배열(VLA)이란? 가변 길이 배열(Variable Length Array, VLA)은 컴파일 시점이 아닌 실행 시점에 크기가 결정되는 자동(auto) 배열을 말합니다. 함수 내에서 선언된 지역 배열의 크기를 매개변수 값에 따라 동적으로 정할 수 있어, 고정 크기 배열보다 훨씬 유연한 메모리 활용이 가능합니다. C 언어는 C99 표준부터 가변 길이 배열을 공식적으로 지원합니다. 다음과 같은 형태로 작성할 수 있습니다. void make_arr(int n){ int array[n]; } int main(){
개요회문(Palindrome)이란 앞에서 읽으나 뒤에서 읽으나 같은 문자열을 의미합니다. 예를 들어 racecar, level, madam 같은 단어들이 대표적인 회문입니다.이번 글에서는 C 언어에서 포인터만을 사용하여 주어진 문자열이 회문인지 확인하는 방법을 알아보겠습니다. 인덱스 연산 없이 포인터 두 개를 앞뒤로 움직이는 방식으로 문제를 해결할 수 있습니다.예를 들어 입력이 s = racecar라면, 앞뒤 어느 방향으로 읽어도 동일하므로 출력은 참(True), 즉 1이 됩니다.해결 접근 방식두 개의 포인터를 활용한 투 포인터(T
람다 함수란 무엇인가?람다 함수(Lambda Function)는 메인 프로그램의 범위(scope) 밖에 별도로 구현할 필요 없이, 코드 내에서 곧바로 정의해 사용할 수 있는 인라인(inline) 함수입니다.람다는 변수에 저장되는 값처럼 취급될 수도 있으며, 함수처럼 호출 가능한 객체, 즉 펑터(Functor)라고도 불립니다.컴파일러가 람다 함수의 정의를 만나면 일반적으로 해당 람다를 위한 고유한 객체(custom object)를 생성합니다.람다 함수는 일반 함수보다 더 많은 기능을 제공합니다. 대표적으로, 사용 중인 변수를 가져올
C 언어는 데니스 리치(Dennis Ritchie)가 개발한 고급 프로그래밍 언어 중 하나로, 오늘날까지도 시스템 소프트웨어 개발의 근간을 이루는 핵심 언어입니다. 이 글에서는 C 언어가 어떻게 탄생했고, 어떤 소프트웨어 발전에 기여했는지 그 역사를 살펴봅니다.C 언어의 탄생 배경C 언어는 원래 UNIX 운영체제를 개발하기 위해 만들어졌습니다. 당시 사용되던 B, BCPL 등 이전 세대의 언어들이 가진 여러 문제점과 한계를 극복하는 것이 목표였습니다. 이러한 설계 철학 덕분에 C는 간결하면서도 강력한 성능을 갖춘 언어로 자리 잡게
프로그램의 작성과 실행 과정프로그램이란 특정 프로그래밍 언어로 작성된 명령어들의 집합입니다. 프로그래머의 역할은 이러한 프로그램을 작성하고 테스트하는 것이며, C 언어로 작성된 소스 코드가 실제로 실행되기까지는 다음의 네 가지 단계를 거치게 됩니다.프로그램 작성 및 편집프로그램 컴파일프로그램 링킹(Linking)프로그램 실행각 단계를 하나씩 자세히 살펴보겠습니다.1단계: 프로그램 작성 및 편집프로그램을 작성할 때는 텍스트 에디터(Text Editor)를 사용합니다.텍스트 에디터를 이용하면 사용자가 문자 데이터를 입력하고, 수정하고,
프로그래밍에서 하나의 데이터 타입을 다른 데이터 타입으로 바꾸는 과정을 형 변환(Type Conversion)이라고 합니다. C 언어에서 형 변환은 크게 두 가지 방식으로 나뉩니다.암시적 형 변환(Implicit Type Conversion)명시적 형 변환(Explicit Type Conversion)암시적 형 변환(Implicit Type Conversion)연산에 참여하는 피연산자들의 데이터 타입이 서로 다를 때, 컴파일러가 자동으로 수행하는 형 변환입니다.개발자가 별도로 지시하지 않아도 컴파일러가 작은 데이터 타입을 더 큰 데
암시적 형 변환(Implicit Type Conversion)이란 컴파일러가 작은 데이터 타입을 더 큰 데이터 타입으로 자동으로 변환하는 것을 말합니다.예를 들어, 대문자 A의 ASCII 값은 65입니다.이 프로그램에서는 문자 A를 입력값으로 사용하고, 이를 해당 ASCII 값인 65로 변환하는 코드를 작성해 보겠습니다.예제 1: 문자 A의 ASCII 값 구하기다음은 암시적 형 변환을 사용하여 대문자 A의 ASCII 값을 찾는 예제입니다.#include<stdio.h> int main(){ char characte
네, C 언어에서는 main() 함수에 인수를 전달할 수 있습니다. 이를 명령줄 인수(Command Line Arguments)라고 부르며, 프로그램 실행 시 운영체제의 명령줄에서 프로그램 이름 뒤에 입력한 값들이 프로그램으로 전달됩니다.main() 함수로 전달할 수 있는 인수는 두 가지입니다.argc(argument count): 명령줄에서 전달된 인수의 개수를 저장합니다.argv(argument vector): 전달된 각 인수를 문자열 배열 형태로 저장합니다.흥미로운 점은 main() 함수가 개발자가 직접 호출하는 것이 아니라,
문제 상황C 프로그래밍 언어에서 for문, while문 같은 반복문이나 goto 문을 사용하지 않고 이름을 10번 출력하는 프로그램을 작성해 보겠습니다.해결 방법일반적으로 코드 블록을 조건이 거짓이 될 때까지 반복 실행하려면 반복문(loop)을 사용합니다. 하지만 반복문 없이도 재귀 함수(recursion)를 활용하면 동일한 결과를 얻을 수 있습니다.재귀란 함수가 자기 자신을 다시 호출하는 기법으로, 종료 조건(base case)을 설정해 두면 반복문과 똑같이 동작하면서 호출 횟수를 제어할 수 있습니다.예제 1: 재귀 함수 활용아래
문제 상황C 언어에서 scanf() 함수로 숫자(정수) 데이터를 입력받은 직후 문자열을 읽으려고 하면, 문자열 입력이 건너뛰어지는 오류가 자주 발생합니다.원인 분석scanf()는 표준 입력(stdin)으로부터 형식화된 데이터를 읽어들이는 함수입니다. 그런데 %d로 정수를 입력받을 때 사용자가 Enter 키를 누르면 숫자 값만 소비되고, 나머지 개행 문자(\n)가 입력 버퍼에 그대로 남게 됩니다.이후 gets()나 scanf(%s, ...) 같은 문자열 입력 함수가 실행되면, 버퍼에 남아 있던 개행 문자를 곧바로 읽어버리고 종료됩니다
문제 상황C 프로그래밍에서 scanf로 정수를 입력받은 직후 문자열을 입력받으려고 하면, 컴파일러가 문자열을 전혀 읽지 않고 건너뛰는 현상이 발생합니다. 이 문제의 원인은 무엇이며, 어떻게 해결할 수 있을까요?원인 분석정수를 입력한 뒤 Enter 키를 누르면, 입력 버퍼에는 개행 문자(\n)가 그대로 남아 있게 됩니다. 이후 문자열을 읽으려고 하면 scanf는 버퍼에 남아 있는 이 개행 문자를 널(null) 문자처럼 처리하여 문자열의 첫 번째 문자 자리에 저장하고 입력을 즉시 종료해 버립니다. 즉, scanf는 널 문자를 만나면 입
C 프로그래밍에서 배열(Array)을 예로 들어 컴파일 타임 초기화와 런타임 초기화의 개념과 차이점을 자세히 알아보겠습니다. 배열(Array)이란? 배열은 연속된 메모리 공간에 저장된 데이터 항목들의 집합입니다. 배열의 각 요소는 인덱스(index)를 통해 접근할 수 있으며, 인덱스는 0부터 시작합니다. 1. 컴파일 타임 초기화(Compile Time Initialization) 컴파일 타임 초기화는 프로그램 코드 안에 직접 초깃값을 작성해 두는 방식입니다. 일반 변수를 초기화하는 것과 동일한 방법이며, 프로그램이 실행되기 전
문제 상황 C 언어에서 피라미드나 직각삼각형처럼 다양한 형태(패턴)로 숫자를 출력하려면 어떤 논리를 사용해야 할까요? 해결 방법 숫자나 기호를 여러 가지 모양으로 출력하려면 for 반복문을 활용하면 됩니다. 핵심은 중첩 반복문(nested loop)입니다. 바깥쪽 반복문: 전체 줄(행)의 개수를 제어합니다. 안쪽 반복문: 각 줄에 출력될 공백이나 문자의 개수를 제어합니다. 예제 1: 피라미드 패턴 출력하기 다음은 별표(*)로 피라미드 모양을 출력하는 C 프로그램입니다. #include <stdio.h> int mai
문제C 언어에는 어떤 스토리지 클래스(기억 클래스)들이 있으며, 각각 어떤 특징을 가지고 있을까요? 프로그램 예제와 함께 살펴보겠습니다.스토리지 클래스란?스토리지 클래스(storage class)는 C 프로그램 안에서 변수나 함수가 어디까지 유효한지를 나타내는 범위(scope)와 얼마나 오래 존재하는지를 나타내는 생존 기간(lifetime)을 정의하는 개념입니다.C 언어의 4가지 스토리지 클래스C 언어에서 사용할 수 있는 스토리지 클래스는 다음과 같습니다.auto (자동 변수)extern (외부 변수)static (정적 변수)reg
이 글에서는 C 언어를 사용하여 5×5 크기의 2차원 배열(행렬)에 대해 각 행의 합(row sum)과 각 열의 합(column sum)을 계산하는 프로그램을 작성해 보겠습니다. 문제 정의 사용자로부터 5×5 행렬의 요소를 런타임(실행 시점)에 콘솔로 입력받은 뒤, 각 행별 합계와 각 열별 합계를 순서대로 출력하는 것이 목표입니다. 해결 접근 방법 이 프로그램은 다음과 같은 흐름으로 동작합니다. 중첩 for 반복문을 사용해 25개의 배열 요소를 입력받습니다. 행 합: 바깥 반복문이 행(i)을 순회하고, 안쪽 반복문이 열(j)을 순
C 언어의 동적 메모리 할당(Dynamic Memory Allocation)은 프로그램 실행 중에 필요한 만큼 메모리를 확보할 수 있게 해주는 강력한 기능입니다. 이 글에서는 동적 메모리 할당을 활용해 배열에 입력된 값들 중 최댓값과 최솟값을 찾는 방법을 예제 코드와 함께 자세히 알아보겠습니다. 문제 정의 목표는 동적 메모리 할당을 사용하여 배열 안에서 최댓값과 최솟값을 찾아 출력하는 C 프로그램을 작성하는 것입니다. 동적 메모리 할당이란? 동적 메모리 할당은 C 프로그래머가 런타임(실행 시점)에 메모리를 할당할 수 있도록 해주
포인터란 무엇인가?포인터(Pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. C 언어에서 포인터는 메모리를 직접 제어할 수 있게 해주는 핵심 개념으로, 배열·문자열 처리와 함수 간 데이터 전달에 널리 활용됩니다.포인터의 선언, 초기화 그리고 접근먼저 다음과 같은 일반적인 변수 선언문을 살펴보겠습니다.int qty = 179;이 코드는 정수형 변수 qty에 179라는 값을 저장합니다. 이때 메모리상에는 qty의 값과 함께 그 값이 위치한 주소(address)가 존재합니다.포인터 선언 방법int *p;위 문장에서 p는 다