네 개의 숫자 a, b, c, d가 있다고 가정해 봅시다. 이번 글에서는 직접 작성한 함수를 활용해 이 네 수 중 최댓값을 구하는 방법을 알아보겠습니다.핵심 아이디어는 간단합니다. 두 수를 입력받아 그중 큰 값을 반환하는 max() 함수를 하나 만들고, 이 함수를 재사용하여 네 수 전체의 최댓값을 단계적으로 구하는 것입니다.예를 들어 입력이 a = 5, b = 8, c = 2, d = 3이라면, 출력은 8이 됩니다.문제 해결 접근 방식이 문제는 다음 단계를 따라 해결할 수 있습니다.두 개의 매개변수 x와 y를 받는 max() 함수를
두 개의 숫자 a와 b가 있다고 가정해 봅시다. 이때 (a + b)와 (a - b)를 동시에 계산할 수 있는 함수를 정의해야 합니다. 그런데 C 언어에서는 하나의 함수가 최대 한 개의 값만 반환할 수 있다는 제약이 있습니다.이러한 제한을 극복하고 여러 개의 결과값을 얻으려면, 포인터를 이용해 함수의 인자로 출력 매개변수(output parameter)를 전달하는 방법을 사용할 수 있습니다. 이 문제에서는 a를 a+b 값으로, b를 a-b 값으로 갱신하는 것이 목표입니다. 따라서 함수를 호출할 때 두 변수의 주소값을 함께 넘겨주어야
개요프로그래밍에서 한 자리 숫자를 해당하는 영어 단어로 바꿔야 하는 경우가 종종 있습니다. 예를 들어 숫자 5가 입력되면 Five를 출력하고, 6이 입력되면 Six를 출력해야 합니다. 만약 입력값이 0에서 9 사이의 범위를 벗어난다면 적절한 안내 메시지를 반환하도록 처리해야 합니다.이번 글에서는 C 언어를 사용해 이 문제를 해결하는 방법을 단계별로 살펴보겠습니다.문제 해결 접근 방법가장 기본적인 방법은 조건문(if-else)을 활용하는 것입니다. 알고리즘은 다음과 같습니다.solve() 함수를 정의하고 숫자 d를 매개변수로 전달합니
문제 개요두 개의 정수 a와 b가 주어졌다고 가정해 봅시다. 이때 a부터 b까지의 각 숫자를 영단어로 변환하여 하나씩 출력해야 합니다. 여기서 숫자를 단어로 출력한다는 것은, 예를 들어 숫자 5가 입력되면 Five라는 문자열을 출력한다는 의미입니다.입력이 a = 3, b = 8이라면 프로그램의 출력 결과는 다음과 같습니다.ThreeFourFiveSixSevenEight해결 접근 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.먼저 정수 d를 매개변수로 받는 solve() 함수를 정의합니다.d가 0보다 작거나 9보다 크면 Beyo
5자리 숫자 num이 주어졌을 때, 각 자릿수의 합을 구하는 방법을 알아보겠습니다. 핵심 아이디어는 숫자를 오른쪽에서 왼쪽으로 한 자리씩 추출하는 것입니다.숫자를 10으로 나누면 나머지(% 연산)가 가장 오른쪽 자릿수가 되고, 몫(/ 연산)은 나머지 앞부분의 숫자가 됩니다. 따라서 나머지를 합에 더한 뒤, 숫자를 몫으로 갱신하는 과정을 반복하면 숫자가 결국 0이 되고, 그동안 더해진 값이 곧 전체 자릿수의 합입니다.알고리즘 접근 방식예를 들어 입력이 num = 58612라면, 출력은 22가 됩니다. 5 + 8 + 6 + 1 + 2
문제 개요세 개의 숫자 a, b, c와 값 n이 주어졌을 때, 다음과 같은 재귀 관계식을 따른다고 가정해 보겠습니다.S(1)은 a를 반환합니다.S(2)는 b를 반환합니다.S(3)은 c를 반환합니다.n > 3인 모든 경우에 S(n)은 S(n-1) + S(n-2) + S(n-3)을 반환합니다.우리의 목표는 이 재귀 관계식에 따라 n번째 항을 구하는 것입니다.예시로 이해하기예를 들어 입력이 a = 5, b = 2, c = 3, n = 6이라면 출력은 28이 됩니다. 그 과정은 다음과 같습니다.S(4) = S(3) + S(2) + S
문제 개요 marks라는 이름의 배열이 있다고 가정해 보겠습니다. 이 배열에는 학생들의 성적이 저장되어 있으며, 짝수 인덱스(marks[0], marks[2] 등)에는 남학생의 성적이, 홀수 인덱스에는 여학생의 성적이 들어 있습니다. 여기에 추가 입력으로 gender가 주어집니다. gender의 값은 b 또는 g 중 하나입니다. 값이 b이면 모든 남학생 성적의 합계를 반환하고, g이면 모든 여학생 성적의 합계를 반환해야 합니다. (배열의 크기는 N) 예를 들어 입력이 N = 9, marks = [8,5,2,6,7,5,9,9,7],
높이가 41이고 폭이 매우 넓은 터널이 있다고 가정해 보겠습니다. 또한 길이, 너비, 높이 정보를 가진 상자들의 목록이 주어져 있습니다. 상자는 자신의 높이가 터널 높이보다 낮을 때에만 터널을 통과할 수 있으며, 이 조건을 만족하는 상자들의 부피를 구해야 합니다. 부피는 길이 × 너비 × 높이로 계산됩니다. 입력으로는 상자의 개수 N과 N행 3열로 구성된 2차원 배열이 주어집니다.문제 예시예를 들어 입력이 N = 4, boxes = [[9,5,20],[3,7,15],[8,15,41],[6,3,42]]라고 하면, 출력 결과는 900과
문제 개요숫자 n이 주어졌을 때, 크기가 n인 배열을 동적으로 생성하고 n개의 정수를 하나씩 입력받은 뒤 그 합을 구하는 프로그램을 작성해 보겠습니다. 배열을 동적으로 생성하려면 stdlib.h 헤더 파일에 포함된 malloc() 또는 calloc() 함수를 사용할 수 있습니다. n의 값 역시 표준 입력(stdin)을 통해 제공됩니다.예를 들어, 입력이 n = 6이고 배열 요소가 9, 8, 7, 2, 4, 3이라면 출력은 33이 됩니다. 9 + 8 + 7 + 2 + 4 + 3 = 33이기 때문입니다.해결 접근 방법이 문제는 다음 단
n개의 요소로 이루어진 배열이 있다고 가정해 보겠습니다. 우리가 해야 할 작업은 배열에 담긴 요소들의 순서를 실제로 뒤집은 뒤 그 결과를 화면에 출력하는 것입니다. 여기서 중요한 점은 단순히 역순으로 출력하는 것이 아니라, 배열 내부의 요소 자체를 제자리(in-place)에서 뒤집어야 한다는 것입니다.예를 들어 입력이 다음과 같다면,n = 6arr = [9, 8, 7, 2, 4, 3]출력 결과는 [3, 4, 2, 7, 8, 9]가 됩니다.해결 접근 방법배열을 뒤집는 가장 기본적인 방법은 양쪽 끝에서부터 서로 만나며 요소를 교환(sw
여러 개의 단어로 이루어진 문장이 담긴 문자열 s가 있다고 가정해 봅시다. 이때 각 단어를 새로운 줄에 하나씩 출력해야 한다면 어떻게 해야 할까요? 이러한 작업은 string.h 헤더 파일에 포함된 strtok() 함수를 사용하면 손쉽게 해결할 수 있습니다. 이 함수는 대상 문자열과 구분자(delimiter)를 인수로 받으며, 여기서는 구분자로 공백 문자 를 사용합니다. 예를 들어 입력이 s = Let us see some string tokenizing fun과 같다면, 실행 결과는 다음과 같습니다. Let us see som
문제 개요영문자와 숫자가 섞여 있는 문자열 s가 주어졌다고 가정해 봅시다. 우리가 해야 할 일은 이 문자열에 포함된 각 숫자(0~9)가 몇 번씩 등장하는지 그 빈도를 계산하여 출력하는 것입니다.이 문제는 크기가 10인 정수 배열 하나만으로 간단하게 해결할 수 있습니다. 배열의 각 인덱스는 숫자 0부터 9에 대응하며, 초기값은 모두 0으로 설정합니다. 이후 문자열을 한 글자씩 훑으면서 숫자를 만날 때마다 해당 인덱스의 값을 1씩 증가시키면 됩니다. 마지막으로 배열 전체를 확인해 빈도가 0보다 큰 숫자들만 출력하면 완성입니다.예시입력이
문자열이 여러 개 담긴 배열이 있을 때, 이 문자열들을 서로 다른 순서로 배치하는 모든 순열(permutation)을 각 줄에 출력해야 하는 경우가 있습니다.예를 들어 입력이 [abc, def, ghi]라면, 출력은 다음과 같습니다.abc def ghi abc ghi def def abc ghi def ghi abc ghi abc def ghi def abc해결 접근 방식이 문제는 사전순으로 다음 순열을 생성하는 next_permutation() 함수를 직접 구현하여 해결할 수 있습니다. 알고리즘의 핵심 단계는 다음과 같습니다.ne
인자의 개수가 정해져 있지 않고, 호출할 때마다 여러 개의 인자를 받을 수 있는 함수를 만들고 싶은 경우가 있습니다. 예를 들어 sum(), max(), min() 세 가지 함수를 만들어 각각 주어진 숫자들의 합계, 최댓값, 최솟값을 계산한다고 생각해 봅시다.이런 종류의 함수를 가변 인자 함수(variadic function)라고 부르며, 정의하려면 함수 매개변수에 줄임표(...) 세 개의 점을 사용해야 합니다. 또한 이를 사용하려면 stdarg.h 헤더 파일을 포함시켜야 합니다.각 함수는 첫 번째 인자로 나머지 인자의 개수(cou
서로 다른 여러 개의 삼각형이 배열로 주어져 있다고 가정해 보겠습니다. 각 삼각형은 triangles[i] = [ai, bi, ci] 형태로 표현되며, 여기서 ai, bi, ci는 i번째 삼각형의 세 변의 길이를 의미합니다. 이번 글에서는 이 삼각형들을 면적을 기준으로 오름차순 정렬하는 C 프로그램을 작성해 보겠습니다.세 변의 길이만 알고 있을 때 삼각형의 면적을 구하는 대표적인 방법은 헤론의 공식(Herons Formula)입니다. 먼저 반둘레 p = (a + b + c) / 2를 계산한 뒤, 면적 = √(p × (p − a) ×
문제 개요두 개의 정수 k와 n이 주어졌다고 가정해 봅시다. 우리의 과제는 1부터 n까지 범위 내의 모든 숫자 쌍에 대해 세 가지 비트 연산, 즉 비트 AND(&), 비트 OR(|), 비트 XOR(^)을 수행하고, 그 결과값 중 주어진 값 k보다 작은 값들만 대상으로 각 연산별 최댓값을 찾아 반환하는 것입니다.예를 들어 입력이 n = 5, k = 5라면 출력은 4 3 4가 됩니다.5 미만의 숫자 쌍들 사이에서 수행한 AND, OR, XOR 연산의 최댓값은 각각 4, 3, 4입니다. 이 세 값 모두 주어진 값 k인 5보다 작다는 것을
도서관에서 일어나는 다양한 작업을 기록하고 조회하는 도서관 관리 시스템을 개발한다고 가정해 보겠습니다. 이 시스템에는 다음과 같은 세 가지 명령을 구현해야 합니다.명령 1: x번 선반에 y페이지 분량의 책 한 권을 추가합니다.명령 2: x번 선반에 있는 y번째 책의 페이지 수를 출력합니다.명령 3: x번 선반에 보관된 책의 총 개수를 출력합니다.명령은 {명령 유형, x, y} 형식의 2차원 배열로 전달되며, y 값이 필요하지 않은 경우 기본값으로 0이 사용됩니다. 프로그램은 각 명령의 실행 결과를 순서대로 출력해야 합니다.문제 예시
버블 정렬(Bubble Sort)은 인접한 두 요소를 비교해 나가며 데이터를 정렬하는 가장 간단한 정렬 알고리즘 중 하나입니다. 모든 요소는 여러 단계(pass)에 걸쳐 비교되는데, 첫 번째 단계에서 가장 큰 값이 배열의 맨 끝으로 이동하고, 두 번째 단계에서 두 번째로 큰 요소가 뒤에서 두 번째 자리에 배치되는 식으로 전체 리스트가 정렬될 때까지 반복됩니다.버블 정렬 알고리즘int arr[5] = { 5, 4, 2, 1, 3 };int i, j;인덱스 i = 0부터 i < 배열 크기까지 순회합니다.인덱스 j = 0부터 배열
C와 C++은 문법이 매우 비슷해 보이지만, 변수를 다시 선언(재선언)하는 상황에서는 서로 다르게 동작합니다. 이 글에서는 다음 네 가지 경우를 실제 코드와 실행 결과를 통해 비교해 보겠습니다. 전역 변수를 초기화 없이 재선언하는 경우 지역 변수를 초기화 없이 재선언하는 경우 전역 변수를 초기화하면서 재선언하는 경우 지역 변수를 초기화하면서 재선언하는 경우 각 사례마다 C 컴파일러와 C++ 컴파일러가 어떻게 반응하는지 하나씩 확인해 보세요. 1-A. C 프로그램: 초기화 없이 전역 변수 재선언하기 #include <std
C 언어의 fopen() 함수는 지정된 경로의 파일을 열기 위해 사용하는 표준 입출력 라이브러리 함수입니다. 파일을 열 때 어떤 모드(mode)를 지정하느냐에 따라 기존 파일의 내용이 유지될 수도, 삭제될 수도 있으므로 각 모드의 동작 방식을 정확히 이해하는 것이 중요합니다. fopen() 함수 문법 FILE *fopen(const char *filename, const char *mode); fopen() 함수는 첫 번째 인자로 열고자 하는 파일의 이름(경로)을, 두 번째 인자로 파일을 여는 방식을 나타내는 모드 문자열을 받습니다